Welcome to Swift (苹果官方Swift文档初译与注解四)---19~28页

在Swift中,函数实际上是一种特殊的组合体(闭包),你也可以定义匿名的组合体(闭包),将代码写在({})中,并使用in
来分隔参数和返回值.

  numbers.map({

  (number: Int) -> Int in

   let result = 3 * number

      return result

      })

  EXPERIMENT //
练习题

  Rewrite
the closure to return zero for all odd numbers. //
重写编写一个组合体,返回值为0;

为了更精确的使用组合体(闭包),你可以有几种选择.当类型是明确的时候,比如代理的回调函数,你可以忽略它的参数的类型,以及返回值类型.单语句的组合体,隐式的返回它执行语句的值.

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

参数的指定使用数字取代名称,这个方法对于非常简短的组合体(闭包)特别适用.
一个组合体(闭包)作为函数的最后参数传递值的时候,可以紧跟在()后面.

  sort([1, 5, 3, 12, 2]) { $0 > $1 }

Objects and Classes

/*对象和类*/

在Swift中,使用class关键字再加上类名来创建一个类.类中的成员/属性声明方法与之前的常量/变量声明一样,只是它们必须在类的定义内.同样,方法和函数也是如此.

  class Shape {

    var numberOfSides = 0

     func simpleDescription() -> String {

       return "A shape with \(numberOfSides)
sides."

     }

  }

  EXPERIMENT //
练习题

  Add
a constant property with let, and add another method that takes an argument.
//使用let添加一个常量属性,再添加一个带有参数的方法;

创建类的实例是在类名的后面加一个(),访问实例方法和实例成员使用点语法.

  var shape = Shape()

  shape.numberOfSides = 7

  var shapeDescription = shape.simpleDescription()

在上面的代码例子中,shape类缺少了一个非常重要的事情:当实例创建的时候,没有初始化.使用init可以创建一个初始化的实例.

  class NamedShape {

  var numberOfSides: Int = 0

    var name: String

    init(name: String) {

       self.name = name

    }

     func simpleDescription() -> String {

      return "A shape with \(numberOfSides)
sides."

    }

  }

注意上述代码中,self是怎样在初始化中区分name属性与name参数的.创建一个类的实例时,参数name的传递就像函数调用时一样.每个属性成员都需要分配一个值无论是在声明中还是在初始化里.

使用 deinit 定义一个注销对象的方法,在这个方法里你可以在对象被销毁前执行一些清理事情.

子类的写法是在类名后面使用:再加上父类的名称.在Swift中,不在要求子类必须有基础的根类,因此在恰当的时候,你可以根据情况需要添加或者去掉父类.

子类的方法可以覆盖(重写)父类中标记的
override的方法,如果覆盖(重写)了父类中没有标记override的方法,编译器会直接报错.编译器也会检测子类中标记为
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()

  EXPERIMENT
// 练习题

  Make
another subclass of NamedShape called Circle that takes a radius and a name as
arguments to its initializer. Implement an area and a describe method on the
Circle class.

/**设计一个继承NamedShape类的子类Circle,并初始化它的成员变量radius和name,再给类添加area和describe方法*/

类的另一种简便存取成员变量的方式是,使用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 triagle with sides
of length \(sideLength)."

   }

  }

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

  triangle.perimeter

  triangle.perimeter = 9.9

  triangle.sideLength

在上述代码例子中,成员变量perimeter的setter方法有一个隐含的变量
newValue,也可以在set后添加(),在其中明显的定义这个变量.

注意在 EquilateralTriangle类中 初始化有三个不同的步骤:

  1. 设置子类声明的成员变量的值;

  2. 调用父类的初始化;

  3. 修改父类定义的成员变量值,以及其他的一些使用getter或者setter再或者实例方法来完成的工作.

/*************后续内容,敬请期待***********/

时间: 2024-07-29 03:04:06

Welcome to Swift (苹果官方Swift文档初译与注解四)---19~28页的相关文章

Welcome to Swift (苹果官方Swift文档初译与注解十一)---70~76页(第二章)

Type Aliases (类型别名) 类型别名是个已经存在的类型定义另一个名字.定义类型别名的时候,使用关键字typealias. 当你想要使用名字来引用一个已经存在的类型时,类型别名将非常有效,并且更适合代码的上下文理解.例如,当要处理指定大小的一个数据时: typealias AudioSample = UInt16 一旦定义了一个类型别名,就可以在任何地方来代替原来的类型名: var maxAmplitudeFound = AudioSample.min // maxAmplitudeF

Welcome to Swift (苹果官方Swift文档初译与注解十)---63~69页(第二章)

如果你将整型与浮点型一起使用,结果将被认为是Double类型: et anotherPi = 3 + 0.14159 // anotherPi 的类型是Double 上述代码中,3的值是没有明确说明类型,因此,根据剩余部分的浮点类型可以确定返回值为Double. Numeric Literals (数值的进制表示) 整数类型可以进行如下表示: A decimal number, with no prefix         // 十进制数值,不需要前缀符号; A binary number, w

Welcome to Swift (苹果官方Swift文档初译与注解三)---11~18页

上述代码中,如果可选值为nil,那么判断条件则为false,而且在{}中的代码将会被忽略,如果可选值不为nil,会将该值逐步运算后赋值给let后面的常量,其中逐步运算过程将依据实际的代码块. Switch 语法支持任何类型数据以及各种比较操作,并不局限在整型. let vegetable = "red pepper" switch vegetable { case "celery": let vegetableComment = "Add some rai

Welcome to Swift (苹果官方Swift文档初译与注解十七)---108~115页(第二章)

Range Operators (范围操作符) 在Swift中包含两种范围操作符,它们都是一个数值范围表达式的一种缩写方式. Closed Range Operator (闭区间范围操作符) 闭区间范围操作符(a...b)定义声明了一个从a到b之间的范围,并且包括a和b. 闭区间操作符通常用在迭代查询一个范围内所有的值,例如for-in循环: for index in 1...5 { println("\(index) times 5 is \(index * 5)") } // 1

Welcome to Swift (苹果官方Swift文档初译与注解五)---29~34页

在Swift中,类的成员变量(属性)如果不需要计算,但又想在给它赋一个新值之前(或者之后)执行一段代码,可以使用willSet 和 didSet来处理.例如下面的代码样例,三角形(triangle)的边长总是与四边形(square)的边长相同. class TriangleAndSquare {   var triangle: EquilateralTriangle {   willSet {     square.sideLength = newValue.sideLength   } } v

Welcome to Swift (苹果官方Swift文档初译与注解三十五)---248~253页(第五章-- 函数 完)

Function Types as Return Types (函数类型作为返回值类型) 一个函数的类型可以作为另一个函数的返回值类型.可以在一个函数的返回值箭头后面写上一个完整的函数类型. 例如: 下面的例子定义了两个简单的函数,分别为stepForward 和 stepBackward.其中stepForward函数返回值比它的输入值多1,stepBackward函数返回值比它输入值少1.这两个函数的 类型都是(Int) -> Int: func stepForward(input: Int

Welcome to Swift (苹果官方Swift文档初译与注解二十七)---189~198页(第四章-- 流程控制)

Switch 一个switch语句里包含一个值,并且用这个值与其他几个可能的匹配模式进行比较,然后根据成功匹配上的模式,执行相应的代码块.switch语句提供了比if语句更多的选项来相应多种潜 在的情况. 最简单的一个例子: switch some value to consider { case value 1:   respond to value 1 case value 2, value 3:   respond to value 2 or 3 default:   otherwise,

Welcome to Swift (苹果官方Swift文档初译与注解二十一)---140~147页(第三章--集合类型)

第三章 Collection Types (集合类型) 在Swift中,提供了两种集合类型用来存储一组值:数组和字典.数组有序的存储相同类型的值;字典存储无序的相同类型的值.字典可以通过唯一的标识(就是所说的键)来查询和访问. 在Swift中,数组和字典总是要清晰的标明他们存储数据的类型.这就意味着不可以将错误的类型插入到数组或字典中.同时也意味着你是明确了解你要遍历的数组或字典里面数据的类 型.在Swift中,集合要显式的声明类型来保证在开发中都会明确的知道它能处理的数据类型. 注意点: 在S

Welcome to Swift (苹果官方Swift文档初译与注解三十七)---261~265页(第六章-- 闭包)

Inferring Type From Context 上下文类型判断 因为排序的闭包是作为一个参数传递给函数,因此Swift可以判定这个参数的类型和根据sort函数第二个参数判断返回值的类型.这个参数的类型是(String, String) -> Bool,这意味着 String,String以及Bool类型都不需要在闭包定义的时候声明.因为所有的类型都可以由系统判定.因此,返回箭头以及参数名字的括号都可以省略: reversed = sort(names, { s1, s2 in retur