Swift中文教程2

来源:互联网 发布:dcs控制系统与cms 编辑:程序博客网 时间:2024/05/22 05:21

函数和闭包

函数

Swift使用func关键字声明函数:

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

通过元组(Tuple)返回多个值:

  • func getGasPrices() -> (Double, Double, Double) {
  •     return (3.59, 3.69, 3.79)
  • }
  • getGasPrices()

支持带有变长参数的函数:

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

函数也可以嵌套函数:

  • func returnFifteen() -> Int {
  •     var y = 10
  •     func add() {
  •         y += 5
  •     }
  •     add()
  •     return y
  • }
  • returnFifteen()

作为头等对象,函数既可以作为返回值,也可以作为参数传递:

  • 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, lessThanTen)

闭包

本质来说,函数是特殊的闭包,Swift中可以利用{}声明匿名闭包:

  • numbers.map({
  •     (number: Int) -> Int in
  •     let result = 3 * number
  •     return result
  •     })

当闭包的类型已知时,可以使用下面的简化写法:

  • numbers.map({ number in 3 * number })

此外还可以通过参数的位置来使用参数,当函数最后一个参数是闭包时,可以使用下面的语法:

  • sort([1, 5, 3, 12, 2]) { $0 > $1 } 类和对象 创建和使用类

Swift使用class创建一个类,类可以包含字段和方法:

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

创建Shape类的实例,并调用其字段和方法。

  • var shape = Shape()
  • shape.numberOfSides = 7
  • varshapeDescription = shape.simpleDescription()

通过init构建对象,既可以使用self显式引用成员字段(name),也可以隐式引用(numberOfSides)。

  • 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进行清理工作。

继承和多态

Swift支持继承和多态(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()

注意:如果这里的simpleDescription方法没有被标识为override,则会引发编译错误。

属性

为了简化代码,Swift引入了属性(property),见下面的perimeter字段:

  • 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 triagle with sides of length \(sideLength)."
  •     }
  • }
  • var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
  • triangle.perimeter
  • triangle.perimeter = 9.9
  • triangle.sideLength

注意:赋值器(setter)中,接收的值被自动命名为newValue。

willSet和didSet

EquilateralTriangle的构造器进行了如下操作:

为子类型的属性赋值。 调用父类型的构造器。 修改父类型的属性。

如果不需要计算属性的值,但需要在赋值前后进行一些操作的话,使用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")
  • triangleAndSquare.square.sideLength
  • triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
  • triangleAndSquare.triangle.sideLength

从而保证triangle和square拥有相等的sideLength。

0 0
原创粉丝点击