//: Playground - noun: a place where people can play@H_404_1@
@H_404_1@
import UIKit@H_404_1@
@H_404_1@
//使用 protocol 来声明一个接口。@H_404_1@
protocol ExampleProtocol {@H_404_1@
var simpleDescription: String { get }@H_404_1@
mutating func adjust()@H_404_1@
}@H_404_1@
//类、枚举和结构体都可以实现接口。@H_404_1@
class SimpleClass: ExampleProtocol {@H_404_1@
String = "A very simple class."@H_404_1@
var anotherProperty: Int = 120@H_404_1@
func adjust() {@H_404_1@
simpleDescription += " Now 100% adjust."@H_404_1@
}@H_404_1@
func add() {@H_404_1@
simpleDescription += " Now 50% add."@H_404_1@
}@H_404_1@
}@H_404_1@
var a = SimpleClass()@H_404_1@
a.adjust()@H_404_1@
let aDescription = a.simpleDescription@H_404_1@
@H_404_1@
struct SimpleStructure: ExampleProtocol {@H_404_1@
String = "A aimple structure"@H_404_1@
func adjust() {@H_404_1@
simpleDescription += " (adjusted)"@H_404_1@
}@H_404_1@
}@H_404_1@
var b = SimpleStructure()@H_404_1@
b.adjust()@H_404_1@
let bDescription = b.simpleDescription@H_404_1@
@H_404_1@
enum SimpleEnum: ExampleProtocol {@H_404_1@
case First(String),Second(String),Third(String)@H_404_1@
@H_404_1@
String {@H_404_1@
get{@H_404_1@
switch self {@H_404_1@
case let .First(text):@H_404_1@
return text@H_404_1@
let .Second(text):@H_404_1@
let .Third(text):@H_404_1@
default:@H_404_1@
return "get error"@H_404_1@
}@H_404_1@
}@H_404_1@
set {@H_404_1@
self = .First(newValue)@H_404_1@
self = .Second(newValue)@H_404_1@
self = .Third(newValue)@H_404_1@
}@H_404_1@
}@H_404_1@
}@H_404_1@
@H_404_1@
func adjust() {@H_404_1@
self {@H_404_1@
let .First(text):@H_404_1@
self = .First(text + " (first case adjust)")@H_404_1@
let .Second(text):@H_404_1@
self = .Second(text + " (Second case adjust)")@H_404_1@
let .Third(text):@H_404_1@
self = .Third(text + " (Third case adjust)")@H_404_1@
}@H_404_1@
}@H_404_1@
}@H_404_1@
var c = SimpleEnum.First("FirstVal")@H_404_1@
c.simpleDescription@H_404_1@
c.adjust()@H_404_1@
c.simpleDescription@H_404_1@
var d = SimpleEnum.Second("Hello")@H_404_1@
var text = d.simpleDescription@H_404_1@
d.simpleDescription = "Word"@H_404_1@
text = d.simpleDescription@H_404_1@
d.adjust()@H_404_1@
text = d.simpleDescription@H_404_1@
//注意声明 SimpleStructure 时候 mutating 关键字用来标记一个会修改结构体的方法。SimpleClass 的声明不需要标记 任何方法因为类中的方法经常会修改类。@H_404_1@
@H_404_1@
//使用 extension 来为现有的类型添加功能,比如添加一个计算属性的方法。你可以使用扩展来给任意类型添加协议,甚至是你从外部库或者框架中导入的类型。@H_404_1@
extension Int: ExampleProtocol {@H_404_1@
String {@H_404_1@
return "The number \(self)"@H_404_1@
}@H_404_1@
self += 42@H_404_1@
}@H_404_1@
}@H_404_1@
//你可以像使用其他命名类型一样使用接口名——例如,创建一个有不同类型但是都实现一个接口的对象集合。当你处理 类型是接口的值时,接口外定义的方法不可用。@H_404_1@
let protocolValue: @H_502_482@ExampleProtocol = a@H_404_1@
protocolValue.simpleDescription@H_404_1@
//即使 protocolValue 变量运用时的类型是 simpleClass,编译器会把它的类型当做 ExampleProtocol。这表示你不能调用类在它实现的接口之外实现的方法或者属性。@H_404_1@