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

Protocols and Extensions 协议(接口)和扩展

Swift使用关键字protocol声明一个协议(接口):

类(classes),枚举(enumerations)和结构(structs)都可采用协议(protocol):


 1 class SimpleClass: ExampleProtocol {
2 var simpleDescription: String = "A very simple class."
3 var anotherProperty: Int = 69105
4 func adjust() {
5 simpleDescription += " Now 100% adjusted."
6 }
7 }
8 var a = SimpleClass()
9 a.adjust()
10 let aDescription = a.simpleDescription
11
12 struct SimpleStructure: ExampleProtocol {
13 var simpleDescription: String = "A simple structure"
14 mutating func adjust() {
15 simpleDescription += " (adjusted)"
16 }
17 }
18 var b = SimpleStructure()
19 b.adjust()
20 let bDescription = b.simpleDescription

练习:

照上例添加一个实现这个接口的枚举

请注意,上例中使用mutating关键词声明了一个方法adjust改动了SimpleStructure结构,而SimpleClass类则没有使用mutating关键字,因为类中的method可以随时改变类。(言外之意,结构中的方法要通过mutating关键字来标记更改结构,这个做法在后续具体翻译methods时会讲解到)

Swift使用extension关键字为已有的类型扩展功能,如增加新的方法或属性,你可以为别处声明的类型添加协议(接口),哪怕是引用过来的库或者框架:


1 extension Int: ExampleProtocol {
2 var simpleDescription: String {
3 return "The number \(self)"
4 }
5 mutating func adjust() {
6 self += 42
7 }
8 }
9 7.simpleDescription

练习:

使用extension关键字为Double类型添加一个求绝对值的属性

你可以像其它命名过的类型一样使用一个协议(接口),譬如,声明一个拥有不同类型但遵守同一个协议(接口)的对象集合。协议(接口)的值运行时,外部的方法是不可用的:


1 let protocolValue: ExampleProtocol = a
2 protocolValue.simpleDescription
3 // protocolValue.anotherProperty //这段代码的运行环境依赖上两个例子,我的理解是,假设常量protocolValue遵守ExampleProtocol协议,那么协议中的simpleDescription可以被引用,因为其在协议内部,而anotherProperty则不是协议内的方法,运行会报错,可以试着运行一下,看错误的结果。--by Joe.Huang

虽然ProtocolValue和SimpleClass类在同一个运行环境里面,但编译器会将其作用域放在ExampleProtocol里。也就是说,我们不能有意无意地使用协议(接口)外的方法或属性。

Generics 泛型

(提到泛型,肯定离不开泛型函数,~~~^_^~~~ 嘿嘿)

通过尖括号<>定义泛型函数或类型(尖括内命名):


1 func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
2 var result = ItemType[]()
3 for i in 0..times {
4 result += item
5 }
6 return result
7 }
8 repeat("knock", 4)

你可以在函数(func),方法(method)中使用泛型,同样地,类(classes),枚举(enumerations)和结构(structs)中也可以:


1 // 重载Swift标准库中的可选类型
2 enum OptionalValue<T> {
3 case None
4 case Some(T)
5 }
6 var possibleInteger: OptionalValue<Int> = .None
7 possibleInteger = .Some(100)

有时需要对泛型做一些需求(requirements),比如需要某个泛型类型实现某个接口或继承自某个特定类型、两个泛型类型属于同一个类型等等,Swift
通过where描述这些需求:


 1 func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {
2 for lhsItem in lhs {
3 for rhsItem in rhs {
4 if lhsItem == rhsItem {
5 return true
6 }
7 }
8 }
9 return false
10 }
11 anyCommonElements([1, 2, 3], [3])

练习:

修改anyCommonElements函数,让其返回一个数组,内容是两个序列的共有元素

如果是简单的需要,你可以省略掉where关键字,比如<T where T: Equatable>可以简写为:<T:
Equatable>。

翻译到此,《The Swift Programming
Language》书中的语言简介部分已经译完了,后面的时间开始陆续翻译详解指南,工程量好大啊,希望有时间的同学能在github上一起帮忙翻译。^_^

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

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

Swift中文教程(七)--协议,扩展和泛型,布布扣,bubuko.com

时间: 2024-08-03 15:36:58

Swift中文教程(七)--协议,扩展和泛型的相关文章

Apple Swift 中文教程 快速参考 基本语法 更新中...

总的来说,语法有java的味道,也有python的味道,还有swift自己的味道. 有些语法还是挺不伦不类的,不太好理解,即使你有几年的java或python经验,也不见得有些语法你能很轻松的看明白. 有些语法特性很好,很个性,但有些语法个人感觉乱,特性多,注意点多,还不太好理解. 慢慢学习吧... ================================================================= 值类型 Int Double Bool String 用双引号"&

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

原文:Swift中文教程(五)--对象和类 Class 类 在Swift中可以用class关键字后跟类名创建一个类.在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文里面,否则,方法和函数的写法也是这样: 1 class Shape { 2 var numberOfSides = 0 3 func simpleDescription() -> String { 4 return "A shape with \(numberOfSides) sides.&q

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

原文:Swift中文教程(六)--枚举和结构 Enumerations 枚举 使用 enum 来创建一个枚举.跟Classes(类)和其他类型的命名方式一样,枚举也可以有Method(方法). 1 enum Rank: Int { 2 case Ace = 1 3 case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten 4 case Jack, Queen, King 5 func simpleDescription() -> Stri

Swift 中文教程

Apple发布了替代oc的利器语言 Swift ,牛叉的中国开发者社区在9天的时间内就汉化了,这是多少中国开发者的福音啊,发现了之后异常兴奋,写个日志保存下,防止立马忘记: GitHub开源项目:<The Swift Programming Language>in Chinese 在线中文版: http://www.swiftguide.cn 或者 http://numbbbbb.github.io/the-swift-programming-language-in-chinese/ 中文社区

Swift中文教程(1)-简介

转载请注明 http://write.blog.csdn.net/postedit/28442151 翻译者:gumpstar 昨天Swift刚出来,以后自己可能会在手机上开发计算机视觉应用,就打算每天学习一点点. 简介 Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束.Swift采用了安全的编程模式和添加现代的功能来是的编程更加简单.灵活和有趣.界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向

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

原文:Swift中文教程(四)--函数与闭包 Function 函数 Swift使用func关键字来声明变量,函数通过函数名加小括号内的参数列表来调用.使用->来区分参数名和返回值的类型: 1 func greet(name: String, day: String) -> String { 2 return "Hello \(name), today is \(day)." 3 } 4 greet("Bob", "Tuesday")

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

原文:Swift中文教程(一)--欢迎来到Swift的世界 Apple凌晨时在WWDC发布了Swift编程语言,语法简介我很喜欢,市面上没有完整的中文教程,我在ibooks里面下载了英文原版,现在开始尝试翻译Swift.我会抽时间坚持原版翻译完,时间有限,不正之处请大家多多指教. 新建了Swifter-QQ群:362232993,同好者进. 第一章:欢迎来到Swift的世界 1,简介 Swift是一款全新的面向IOS和OS Apps的编程语言,建立在C语言和Objective-C语言的基础之上,

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

原文:Swift中文教程(三)--流程控制 Swift用if和switch编写条件控制语句,用for-in,for,while和do-while编写循环.条件控制语句和循环语句中,小括号是可选的,但花括号包住这个循环体是必须的: 1 let individualScores = [75, 43, 103, 87, 12] 2 var teamScore = 0 3 for score in individualScores { 4 if score > 50 { 5 teamScore += 3

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

原文:Swift中文教程(二)--简单值 Swift使用let关键字声明常量,var关键字声明变量.常量无需在编译时指定,但至少要被赋值一次.也就是说,赋值一次多次使用: 1 var myVariable = 42 2 myVariable = 50 3 let myConstant = 42 这里的常量赋值之后值不能更改,应该提高重用性. 一个常量或变量的值与类型必须是一致的.不过,你不需要指明它的类型,因为编译器会根据你所赋的值推断它的类型,在上面的例子中,编译器会判断到myVariable