原文:Swift中文教程(五)--对象和类

  

  Class 类

  在Swift中可以用class关键字后跟类名创建一个类。在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文里面,否则,方法和函数的写法也是这样:

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

练习:

用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属性的。创建类的实例时,构造器里的参数传递和函数的参数传递形式是一样的。每个属性都需要为其指定一个值,无论是在声明中(如nameOfSides),或是在构造器内(如name)。

  使用 deinit 来创建一个析构器,来执行对象销毁时的清理工作。

  继承和多态

  子类可以加冒号后直接跟超类名,子类声明时并不需要非得制定任何标准基类,所以子类后的超类可以被忽略。

  子类的方法覆盖或重载超类中的实现要加上override标记,否则,编译器会报错,编译器也会检测被标记为override的重载方法到底有没有覆盖到超类。

 class Square: NamedShape {//接上一例,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 {//在此处用override重载了上一例中超类NameSpace的方法simpleDescription
return "A square with sides of length \(sideLength)."
}
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()

练习:

编写另一个NamedShape的子类:Circle ,传入半径和名字作为参数到其构造器,并在Circle类中实现area和describe方法。

  此外,声明过的属性通常还有一个get和一个set方法:

 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的set中值的默认名是newValue,你可以再set后面以小括号的方式为其指定其它的名字。

  请注意, EquilateralTriangle类的构造器有三个不同的步骤:

    第一步,设置子类各个属性的值;

    第二步,调用超类的构造器;

    第三步,改变超类中定义的属性的值,其它的方法,get,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")
triangleAndSquare.square.sideLength
triangleAndSquare.triangle.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.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)

  当与可选值(详见第三章的If语句介绍)一起工作时,你可以在方法或属性前写 "?" 操作符。如果值在"?"之前就已经是 nil ,所有在 "?" 之后的都会自动忽略,而整个表达式是 nil 。另外,可选值是未封装的,所有 "?" 之后的都作为未封装的值。在这两种情况中,整个表达式的值是可选值:

 let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")//?可选值的介绍详见第三章的If语句部分
let sideLength = optionalSquare?.sideLength

谢谢,Swifter-QQ群:362232993,同好者进~

github地址:https://github.com/Joejo/Swift-lesson-for-chinese

  

Swift中文教程(五)--对象和类的更多相关文章

  1. Swift中文教程(四)--函数与闭包

    原文:Swift中文教程(四)--函数与闭包 Function 函数 Swift使用func关键字来声明变量,函数通过函数名加小括号内的参数列表来调用.使用->来区分参数名和返回值的类型: fu ...

  2. Swift中文教程(六)--枚举和结构

    原文:Swift中文教程(六)--枚举和结构 Enumerations 枚举 使用 enum 来创建一个枚举.跟Classes(类)和其他类型的命名方式一样,枚举也可以有Method(方法). enu ...

  3. Swift中文教程(一)--欢迎来到Swift的世界

    原文:Swift中文教程(一)--欢迎来到Swift的世界 Apple凌晨时在WWDC发布了Swift编程语言,语法简介我很喜欢,市面上没有完整的中文教程,我在ibooks里面下载了英文原版,现在开始 ...

  4. Swift中文教程(二)--简单值

    原文:Swift中文教程(二)--简单值 Swift使用let关键字声明常量,var关键字声明变量.常量无需在编译时指定,但至少要被赋值一次.也就是说,赋值一次多次使用: var myVariable ...

  5. Swift中文教程(三)--流程控制

    原文:Swift中文教程(三)--流程控制 Swift用if和switch编写条件控制语句,用for-in,for,while和do-while编写循环.条件控制语句和循环语句中,小括号是可选的,但花 ...

  6. Java 教程 (Java 对象和类)

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友 ...

  7. Apple Swift 中文教程 高速參考 基本的语法

    总的来说.语法有java的味道,也有python的味道,还有swift自己的味道. 有些语法还是挺不伦不类的,不太好理解,即使你有几年的java或python经验,也不见得有些语法你能非常轻松的看明确 ...

  8. Swift中文教程(七)--协议,扩展和泛型

    Protocols and Extensions 协议(接口)和扩展 Swift使用关键字protocol声明一个协议(接口): 类(classes),枚举(enumerations)和结构(stru ...

  9. Swift中文教程(二)基本运算符

    1.基本运算符 运算符是一种特定的符号或表达式,用来检验.改动或合并变量.比如,用求和运算符+能够对两个数字进行求和(如let i = 1 + 2):略微复杂一点的样例有逻辑与操作符&& ...

随机推荐

  1. 深入浅出JMS(一)——JMS简要

    假设手机只能实时通话.没有邮件和短信功能发生?一个电话回来.只是没有足够的时间去连接.然后传递这款手机的信息肯定是不接受. 么不能先将信息存下来.当用户须要查看信息的时候再去获得信息呢?伴随着这个疑惑 ...

  2. maven学习系列(一)—maven安装和基本设置

    maven下载和配置 第一步:下载apache-maven-2.3.2-bin.zip并解压到D:\tools,下载地址http://maven.apache.org/download.cgi 第二步 ...

  3. 【YouVersion】 The Bible 圣经App

    [YouVersion] The Bible 圣经 App 今天向大家郑重推荐一款非常棒的圣经App : <The Bible>   YouVersion 团队开发的全球下载量和安装数目第 ...

  4. Uncaught TypeError: Cannot read property &#39;call&#39; of undefined jquery.validate.min.js:28

    最近在做表单验证时,,自己写的addMethod 方法总是不起作用.折腾了将近一天. 报告的错误,如下面的 Uncaught TypeError: Cannot read property 'call ...

  5. CMSIS标准

    CMSIS 标准(Cortex Microcontroller Software Interface Standard) ,翻译过来是"ARM Cortex™ 微控制器软件接口标准" ...

  6. 文章13称号 Add Two Numbers

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...

  7. MongoDB日常保养

    它引入了程序来进行维护管理工具 MongoDB的日常维护包含使用配置文件,设置訪问控制.Shell交互,系统监控和管理,数据库日常备份和恢复 启动和停止MongoDB 启动后能够通过数据库的IP加po ...

  8. AspNet MVC4 教育-28:Asp.Net MVC4 Ajax技术部门四舍五入余速Demo

    A.创建一个Basic项目类型. B.于Models创建一个文件夹: DivModel.cs: using System; using System.Collections.Generic; usin ...

  9. 简单实现Android平台多语言

    这里,我们认识到两种语言.中国简体和繁体中国. 在res文件建议两个文件夹 values-zh-rCN values-zh-rTW 两个目录下都有一个strings.xml文件. 两个同名文件的字符串 ...

  10. android利用jdk制作签名

    Apk签名首先要有一个keystore的签名用的文件. keystore是由jdk自带的工具keytool生成的.详细生成方式參考一下: 開始->执行->cmd->cd 到你安装的j ...