• Swift Tour


    设置常数使用let,设置变量使用var

    var myVariable = 42
    myVariable = 50
    let myConstant = 42

    编译器可以自己推断出变量类型因此不用显式限定。

    如果没有赋初值或信息不足以让编译器判断,则可以通过冒号显式声明:

    let implicitInteger = 70
    let implicitDouble = 70.0
    let explicitDouble: Double = 70

    任何变量类型都不可以隐式转换,所有变量之间的转换都为显式:

    let label = "The width is "
    let width = 94
    let widthLabel = label + String(width)

    对于String的转换,有一种更简单的方法:

    let apples = 3
    let oranges = 5
    let appleSummary = "I have (apples) apples."
    let fruitSummary = "I have (apples + oranges) pieces of fruit."

    Dictionary和List:

    var shoppingList = ["catfish", "water", "tulips", "blue paint"]
    shoppingList[1] = "bottle of water"
     
    var occupations = [
        "Malcolm": "Captain",
        "Kaylee": "Mechanic",
    ]
    occupations["Jayne"] = "Public Relations"

    初始化:

    let emptyArray = [String]()
    let emptyDictionary = [String: Float]()

    如果类型相对固定,可以使用[]或[:]创建空的list和dictionary:

    shoppingList = []
    occupations = [:]

    for if语句:

    let individualScores = [75, 43, 103, 87, 12]
    var teamScore = 0
    for score in individualScores {
        if score > 50 {
            teamScore += 3
        } else {
            teamScore += 1
        }
    }
    print(teamScore)

    需要注意,由于没有隐式转换,所以直接用数字当比较条件会报错。

    但是在optional变量时,可以使用let和if一起判断是否optional变量存在

    var optionalString: String? = "Hello"
    print(optionalString == nil)
     
    var optionalName: String? = "John Appleseed"
    var greeting = "Hello!"
    if let name = optionalName {
        greeting = "Hello, (name)"
    }

    对于optional变量,还可以通过??赋予默认值:

    let nickName: String? = nil
    let fullName: String = "John Appleseed"
    let informalGreeting = "Hi (nickName ?? fullName)"

    let还可以用于对变量进行匹配:

    let vegetable = "red pepper"
    switch vegetable {
    case "celery":
        print("Add some raisins and make ants on a log.")
    case "cucumber", "watercress":
        print("That would make a good tea sandwich.")
    case let x where x.hasSuffix("pepper"):
        print("Is it a spicy (x)?")
    default:
        print("Everything tastes good in soup.")
    }

    swift中的switch语句自动break。

    当使用for-in遍历dictionary的时候,key-value对是无序的:

    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
            }
        }
    }
    print(largest)

    while和do-while

    var n = 2
    while n < 100 {
        n = n * 2
    }
    print(n)
     
    var m = 2
    repeat {
        m = m * 2
    } while m < 100
    print(m)

    循环时还可以使用..<进行range循环:

    var total = 0
    for i in 0..<4 {
        total += i
    }
    print(total)

    使用func声明函数,通过->将形参和返回值分开:

    func greet(name: String, day: String) -> String {
        return "Hello (name), today is (day)."
    }
    greet("Bob", day: "Tuesday")

    函数还可以传入list,返回tuple:

    func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
        var min = scores[0]
        var max = scores[0]
        var sum = 0
        
        for score in scores {
            if score > max {
                max = score
            } else if score < min {
                min = score
            }
            sum += score
        }
        
        return (min, max, sum)
    }
    let statistics = calculateStatistics([5, 3, 100, 3, 9])
    print(statistics.sum)
    print(statistics.2)

    同时形参还可以不定:

    func sumOf(numbers: Int...) -> Int {
        var sum = 0
        for number in numbers {
            sum += number
        }
        return sum
    }
    sumOf()
    sumOf(42, 597, 12)

    函数还可以嵌套声明:

    func sumOf(numbers: Int...) -> Int {
        var sum = 0
        for number in numbers {
            sum += number
        }
        return sum
    }
    sumOf()
    sumOf(42, 597, 12)

    函数还可以作为参数进行传递:

    func makeIncrementer() -> ((Int) -> Int) {
        func addOne(number: Int) -> Int {
            return 1 + number
        }
        return addOne
    }
    var increment = makeIncrementer()
    increment(7)
    func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
        for item in list {
            if condition(item) {
                return true
            }
        }
        return false
    }
    func lessThanTen(number: Int) -> Bool {
        return number < 10
    }
    var numbers = [20, 19, 7, 12]
    hasAnyMatches(numbers, condition: lessThanTen)

    类声明和对象声明:

    class Shape {
        var numberOfSides = 0
        func simpleDescription() -> String {
            return "A shape with (numberOfSides) sides."
        }
    }
    
    var shape = Shape()
    shape.numberOfSides = 7
    var shapeDescription = shape.simpleDescription()

    构造函数:

    class NamedShape {
        var numberOfSides: Int = 0
        var name: String
        
        init(name: String) {
            self.name = name
        }
        
        func simpleDescription() -> String {
            return "A shape with (numberOfSides) sides."
        }
    }

    析构函数为deinit

    继承时,override的方法需要显式声明:

    class Square: NamedShape {
        var sideLength: Double
        
        init(sideLength: Double, name: String) {
            self.sideLength = sideLength
            super.init(name: name)
            numberOfSides = 4
        }
        
        func area() ->  Double {
            return sideLength * sideLength
        }
        
        override func simpleDescription() -> String {
            return "A square with sides of length (sideLength)."
        }
    }
    let test = Square(sideLength: 5.2, name: "my test square")
    test.area()
    test.simpleDescription()

    Setter和Getter

    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
            }
            set {
                sideLength = newValue / 3.0
            }
        }
        
        override func simpleDescription() -> String {
            return "An equilateral triangle with sides of length (sideLength)."
        }
    }
    var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
    print(triangle.perimeter)
    triangle.perimeter = 9.9
    print(triangle.sideLength)

    在这里setter传参隐式声明为newValue,可以在set后面括号前面声明自定义的变量名。

    如果需要在set之前或之后进行预定义操作,可以使用willSet和didSet:

    class TriangleAndSquare {
        var triangle: EquilateralTriangle {
            willSet {
                square.sideLength = newValue.sideLength
            }
        }
        var square: Square {
            willSet {
                triangle.sideLength = newValue.sideLength
            }
        }
        init(size: Double, name: String) {
            square = Square(sideLength: size, name: name)
            triangle = EquilateralTriangle(sideLength: size, name: name)
        }
    }
    var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
    print(triangleAndSquare.square.sideLength)
    print(triangleAndSquare.triangle.sideLength)
    triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
    print(triangleAndSquare.triangle.sideLength)

    在对optional变量操作时,如果optional变量为nil,则?之后的语句全部不执行,整条语句为nil。

    let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
    let sideLength = optionalSquare?.sideLength

    structure和class的不同在于,structure通过复制的方式传参,而class通过引用。

  • 相关阅读:
    array_count_values源码
    php 编译安装记录
    mysql 安装的过程做个记录
    初识highcharts 库
    php 不重新编译增加新扩展的方法
    备考PMP
    Beyond Compare4破解--写reg脚本删除注册表
    SourceTree 跳过登录
    正则 (?=exp)
    springmvc--处理器的返回参数
  • 原文地址:https://www.cnblogs.com/xiaoxiaff/p/5380666.html
Copyright © 2020-2023  润新知