zoukankan      html  css  js  c++  java
  • 冷市攻略:Listo 教你 25 今天的社会 Swift 语言 - 02 Swift Tour

    import Foundation


    //***********************************************************************************************

    //1.Hello world

    //_______________________________________________________________________________________________

    //输出 "Hello, world"

    println("Hello, world")    //使用 println 函数来输出字符串


    //***********************************************************************************************

    //2.Simple Values(简单值)

    //_______________________________________________________________________________________________

    //使用 let 命名常量,使用 var 命名变量

    let myConstant =42

    var myVariable =42

    myVariable = 50

    println("The constant is(myConstant),the variable is(myVariable)")


    //_______________________________________________________________________________________________

    //声明数据类型

    let explicitDouble:Double = 70

    println("The Double type number is(explicitDouble)")


    //_______________________________________________________________________________________________

    //类型转化

    let label = "The width is "

    let width =94

    let widthLabel = label + String(width)     //不同类型数据进行基本运算的时候须要进行类型转化

    println(widthLabel)


    //_______________________________________________________________________________________________

    //简单的字符串引用数据

    let apples =3

    let appleSummary ="I have (apples) apples"

    println(appleSummary)


    //_______________________________________________________________________________________________

    //数组创建和使用

    var shoppingList = ["water","bread", "milk","paper", "pen"]

    println(shoppingList[2])           //获取数组中的第三个元素


    //_______________________________________________________________________________________________

    //字典的创建和使用

    var occupations = ["Malcolm":"Captain", "Kaylee":"Mechanic"]

    occupations["Jayne"] ="Public relations"      //给字典加入或者改动一个元素。系统检索字典 occupations是否包括 key Jayne,假设有进行 key 相应的 value 值的改动,假设没有,进行新的 key value 的加入

    println(occupations)


    //_______________________________________________________________________________________________

    //创建空的数组和字典

    let emptyArray = [String]()    //创建空的数组

    let emptyDictionary =Dictionary<String,Float>()       //创建空的字典


    //***********************************************************************************************

    //3.Control Flow(控制流)

    //_______________________________________________________________________________________________

    //简单的控制语句

    let individualScores = [75,43, 103, 87, 12]

    var teamScore =0

    for score inindividualScores{

       if score > 50{             //if 语句之后必须为返回一个 Bool类型的数据

           teamScore += 3

        }

       else{

           teamScore += 1

        }

    }

    println("The teamscore is(teamScore)")


    //_______________________________________________________________________________________________

    //可选类型数据

    var optionalString:String?

    = "Hello"

    optionalString == nil       //设置 optionalString数据为可选类型数据,可选类型是指 optionalString有详细的值或者为空两种情况


    var optionalName:String? = "Joho Appleseed"

    var greeting ="Hello"

    if let name =optionalName{        //使用 if let 来推断可选类型数据是否有详细的值

       greeting = "Hello,(name)"

    }

    println(greeting)


    //_______________________________________________________________________________________________

    //switch 语句

    let vegetable ="red pepper"

    var vegetableComment:String

    switch vegetable{          //使用 switch 语句。每一条 case 代表一条推断。符合条件则运行语句

        case"celery":

            vegetableComment ="Add some raisins and make ants on a log."

        case"cucumber","watercress":

            vegetableComment ="That would make a good tea sandwich."

        caselet x where x.hasSuffix("pepper"):            //使用 "x.hasSuffix("***")"函数来推断 x 变量末尾是否为 ***

            vegetableComment ="Is it a spicy (x)?

    "

        default:

            vegetableComment ="Everything tastes good in soup."

    }

    println(vegetableComment)


    //_______________________________________________________________________________________________

    //使用 for in

    let interestingNumbers = ["Prime": [2,3, 5, 7, 11, 13],"Fibonacci": [1,1, 2, 3, 5, 8],"Square": [1,4, 9, 16, 25],]

    var largest =0

    for (kind, numbers)in interestingNumbers{

       for number in numbers{

           if number > largest{

               largest = number

            }

        }

    }

    println("The largest number is(largest)")


    //_______________________________________________________________________________________________

    //使用 while do while 语句

    var n =2

    whilen < 100{

       n = n * 2

    }

    println("the n is(n)")


    var m =2

    do{

       m = m * 2

    }while m < 100

    println("the m is(m)")


    //_______________________________________________________________________________________________

    //范围运算符

    var firstForLoop =0

    for iin 0..<4{            //使用 "..<"表示前闭后开范围

        firstForLoop += i

    }

    println("firstForLoop is(firstForLoop)")


    var secondForLoop =0

    forvar i = 0; i <4; ++i{      //使用一般方法进行运算

        secondForLoop += i

    }

    println("secondForLoop is(secondForLoop)")


    var thirdForLoop =0

    for iin 0...4{            //使用 "..."表示前闭后闭范围

        thirdForLoop += i

    }

    println("thirdForLoop is(thirdForLoop)")


    //***********************************************************************************************

    //4.Function and Closures(函数和闭包)

    //_______________________________________________________________________________________________

    //函数的创建和使用

    func greet(name: String, day: String) -> String{        //使用 "func 函数名(參数) -> 返回值类型{ return *** }" 来创建一个函数

        return"Hello (name), today is (day)"

    }

    println(greet("Bob","Tusday"))


    //_______________________________________________________________________________________________

    //无參数的函数

    func getGasPrices() -> (Double,Double, Double){       //函数參数为空

        return (3.59,3.69, 3.79)

    }

    println(getGasPrices())


    //_______________________________________________________________________________________________

    //不确定參数的函数

    func sumOf(numbers:Int...) -> Int{        //当函数參数不确定数量的时候,使用 "..."就可以

       var sum = 0

       for number in numbers{

            sum += number

        }

       return sum

    }

    println(sumOf(234,34,12))


    //_______________________________________________________________________________________________

    //函数嵌套

    func returnFifteen() ->Int{

       var y = 10

       func add(){

            y +=5

        }

       add()

       return y

    }

    println(returnFifteen())


    //_______________________________________________________________________________________________

    //函数作为返回值

    func makeIncrementer() -> (Int ->Int){     //定义返回值为函数类型的函数 makeIncrementer

       func addOne(number: Int) -> Int{

           return 1 + number

        }

        return addOne

    }

    var increment =makeIncrementer()

    println(increment(7))


    //_______________________________________________________________________________________________

    //函数做參数

    func hasAnyMatches(list: [Int], condition:Int ->Bool) -> Bool{    //设置參数为整型数组和函数类型的函数 hasAnyMatches

       for item in list{

           if condition(item){

               return true

            }

        }

        return false

    }

    func lessThanTen(number:Int) -> Bool{     //定义函数符合 hasAnyMatches的參数类型

       return number < 10

    }

    var numbers = [20,19, 7, 12]

    println(hasAnyMatches(numbers,lessThanTen))


    //_______________________________________________________________________________________________

    //闭包

    var numberArray = [3,45, 23, 523, 2]

    let number =numberArray.map({           //Swift 中的 Array中有一个 map 方法。其获取的一个闭包表达式作为其唯一參数,数组中的每个元素调用次该闭包函数。并返回该元素所映射的值,详细的映射方式和返回值类型由闭包来指定

        (number:Int) -> Int in

       let result = 3 * number

       return result

    })

    println(number)


    //***********************************************************************************************

    //5.Objects and Classes(对象和类)

    //_______________________________________________________________________________________________

    //类的创建

    class Shape{               //使用 class声明一个类,类中的属性声明和声明常量变量一样。方法和函数声明是同样的方式

       var numberOfSides = 0

       func simpleDescription() -> String{

            return"A shape with (numberOfSides) sides."

        }

    }


    //_______________________________________________________________________________________________

    //使用类

    var shape = Shape()     //实例化一个类。注意类名首字母大写

    shape.numberOfSides =7         //设置类的属性

    var shapeDescription =shape.simpleDescription()       //訪问类的方法

    println(shapeDescription)


    //_______________________________________________________________________________________________

    //使用 init 创建一个类的初始化器

    class NamedShape{

       var numberOfSides: Int = 0

       var name: String

        

       init(name: String){

            self.name = name       //self 用来区分属性和參数,在初始化这个类时,每一个初始值必须设置

        }

        

       func simpleDescription() -> String{

            return"(name) find A shape with(numberOfSides) sides."

        }

    }

    var name = NamedShape(name: "Listo")     //实例化而且初始化类 NameShape

    name.numberOfSides =7

    var nameDescription =name.simpleDescription()

    println(nameDescription)


    //_______________________________________________________________________________________________

    //继承和覆写

    class Square:NamedShape{

       var sideLength: Double

        

       init(sideLength: Double, name:String){

           self.sideLength = sideLength

           super.init(name: name)

            numberOfSides =4

        }

        

       func area() -> Double{

            returnsideLength * sideLength

        }

        

       override func simpleDescription() ->String {           //使用 override来覆写父类中的方法

            return"A square with sides of length (sideLength)"

        }

    }

    let test =Square(sideLength:  5.2, name: "my test square")

    println(test.area())

    println(test.simpleDescription())


    //_______________________________________________________________________________________________

    //除了简单的存储属性。属性能够有一个 getter setter

    class EquilateralTriangle:NamedShape{

       var sideLength: Double =0.0

        

       init(sideLength: Double, name:String){

           self.sideLength = sideLength

           super.init(name: name)

            numberOfSides =3

        }

        

       var perimeter: Double{

       get{

           return 3.0 *sideLength             //get 为获取这个属性的值

        }

       set{

           sideLength = newValue / 3.0         //newValue 代表 set给这个属性的新的值

        }

        }

        

       override func simpleDescription() ->String {

            return"An equilateral triangle with side of length (sideLength)"

        }

    }

    var triangle =EquilateralTriangle(sideLength: 3.1, name: "a triangle")

    println(triangle.perimeter)

    triangle.perimeter =9.9

    println(triangle.sideLength)


    //_______________________________________________________________________________________________

    //类中的方法和函数的差别

    class Counter{

       var count: Int =0

       func incrementBy(amount: Int, numberOfTimes times: Int){

           count += amount * times

        }

    }

    var counter =Counter()

    counter.incrementBy(2, numberOfTimes: 7)       //类中的方法须要在调用的时候写出參数的形參名(第一个參数名不能够写),函数在调用的时候除了外部參数存在的情况,否则不能參数的形參名


    //***********************************************************************************************

    //6.Enumeration and Structures(枚举和结构体)

    //_______________________________________________________________________________________________

    //枚举的创建

    enum Rank: Int{         //使用 enum 创建一个枚举,注意枚举名用大写

        case Ace =1        //指定第一个原始值为 1,后面的数据一次递增分配

       case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten

       case Jack, Queen, King

       func simpleDescription() -> String{

            switchself{       //这里的 self 就是一个枚举类型的值(enum value

           case .Ace:

               return "ace"

           case .Jack:

               return "jack"

           case .Queen:

               return "queen"

           case .King:

               return "king"

           default:

                returnString(self.toRaw())    //使用 toRaw fromRaw 来实现原始值和枚举值的转换

            }

        }

    }

    let ace =Rank.Ace

    println(ace.simpleDescription())

    let aceRawValue =ace.toRaw()

    println(aceRawValue)


    iflet convertedRank = Rank.fromRaw(3){

       let threeDescription = convertedRank.simpleDescription()

       println(threeDescription)

    }


    //_______________________________________________________________________________________________

    //枚举成员是实际的值,不是其原始值的第二种表达方式

    enum Suit{

       case Spades, Hearts, Diamonds, Clubs

       func simpleDescription() -> String{

           switch self{

           case .Spades:

               return "spades"

           case .Hearts:

               return "hearts"

           case .Diamonds:

               return "diamonds"

           case .Clubs:

               return "clubs"

            }

        }

    }

    let hearts =Suit.Hearts

    let heartDescription =hearts.simpleDescription()

    println(heartDescription)


    //_______________________________________________________________________________________________

    //结构体的创建(结构体和类之间最重要的一个差别是,结构体通过复制传递。类通过引用传递)

    struct Card{       //创建结构体,结构体名大写

       var rank: Rank

       var suit: Suit

       func simpleDescription() -> String{

            return"The (rank.simpleDescription()) of(suit.simpleDescription())"

        }

    }

    let threeOfSpades =Card(rank: .Three, suit: .Spades)

    let threeOfSpadesDescription =threeOfSpades.simpleDescription()

    println(threeOfSpadesDescription)


    //_______________________________________________________________________________________________

    //枚举的应用

    enum ServerResponse{

       case Result(String, String)

       case Error(String)

    }


    let success = ServerResponse.Result("6:00 am","8:09 pm")

    let failure = ServerResponse.Error("Out of cheese")


    var serverResonse:String

    switch success{

    caselet .Result(sunrise, sunset):

        serverResonse ="Sunrise is at (sunrise) and sunset is at(sunset)"

    caselet .Error(error):

       serverResonse = "Failure...(error)"

    }

    println(serverResonse)


    //***********************************************************************************************

    //7.Protocols and Extensions(协议和扩展)

    //_______________________________________________________________________________________________

    //协议的创建

    protocol ExamplePortocol{      //使用 protocol 创建协议,协议名要大写

       var simpleDescription: String { get}

       mutating func adjust()

    }


    //_______________________________________________________________________________________________

    //类,枚举,结构体都能够写协议

    class SimpleClass:ExamplePortocol{             //类遵守协议。必须实现协议中的方法

       var simpleDescription: String = "A very simple class."

       var anotherProperty: Int = 69105

       func adjust(){                              //在类中书写协议方法是不须要加上 mutating,由于一个类的方法能够改动类

            simpleDescription +=" Now 100% adjusted."

        }

    }

    var a = SimpleClass()

    a.adjust()

    let aDescription =a.simpleDescription

    println(aDescription)


    struct SimpleStructure:ExamplePortocol{        //结构体遵守协议。必须实现协议中的方法

       var simpleDescription: String = "A simple structure"

       mutating  func adjust() {                  //在结构体中书写协议方法时要记得加上 mutating

            simpleDescription +=" (adjusted)"

        }

    }

    var b = SimpleStructure()

    b.adjust()

    println(b.simpleDescription)


    //_______________________________________________________________________________________________

    //使用 extension将扩展功能加入到现有的类型中

    extensionInt: ExamplePortocol{            //为协议加入功能

       var simpleDescription: String{

        return"The number (self)"

        }

       mutating func adjust(){

           self += 42

        }

    }


    //_______________________________________________________________________________________________

    //使用协议作为数据类型

    let protocolValue:ExamplePortocol = a

    println(protocolValue.simpleDescription)


    //***********************************************************************************************

    //8.Generics(通用数据类型)

    //_______________________________________________________________________________________________

    //尖括号内写一个名字做一个通用的函数或类型

    func repeat<ItemType>(item:ItemType, times: Int) -> [ItemType] {      //做通用的类型

       var result = [ItemType]()

       for i in 0..<times{

            result += item

        }

       return result

    }

    println(repeat("Knock",4))


    //_______________________________________________________________________________________________

    //你能够通用形式的函数和方法,以及类、枚举、结构

    enum OptionalValue<T>{

       case None

       case some(T)

    }

    var possibleInteger:OptionalValue<Int> = .None

    possibleInteger = .some(100)

    println(possibleInteger)

  • 相关阅读:
    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    11
    实战 迁移学习 VGG19、ResNet50、InceptionV3 实践 猫狗大战 问题
    tx2系统备份与恢复
    如何在Ubuntu 18.04上安装和卸载TeamViewer
    bzoj 3732 Network (kruskal重构树)
    bzoj2152 聪聪可可 (树形dp)
    牛客 216D 消消乐 (二分图最小点覆盖)
    牛客 197E 01串
    Wannafly挑战赛23
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5032494.html
Copyright © 2011-2022 走看看