是什么
相信大家都知道self這個(gè)關(guān)鍵字的具體作用胧华,它跟OC里的self基本一樣睬涧。但是對(duì)于Self來說...(WTF唬血,這是什么東西)
當(dāng)你用錯(cuò)Self的時(shí)候編譯器會(huì)這樣提示
'Self' is only available in a protocol or as the result of a method in a class
分割開來的話就是兩個(gè)意思
1.Self可以用于協(xié)議(protocol)中限制相關(guān)的類型
2.Self可以用于類(Class)中來充當(dāng)方法的返回值類型
為什么
對(duì)于第一種情況躺同,可以參考書中的例子
protocol Copyable {
func copy() -> Self
func clamp(intervalToClamp: Self) -> Self
}
在這個(gè)協(xié)議中的兩個(gè)方法都用Self來對(duì)類型進(jìn)行限制
第二種情況可以參考下面這個(gè)例子
class A: Copyable {
var num = 1
required init() {
}
func copy() -> Self {
let type = type(of: self)
print(type)
let result = type.init()
result.num = num
return result
}
func clamp(intervalToClamp: A) -> Self {
let result = type(of: self).init()
result.num = num
return result
}
class func calssFunc() -> Self {
let type = self
print(type)
let result = type.init()
return result
}
}
class B: A {
func clamp(intervalToClamp: B) -> Self {
let result = type(of: self).init()
result.num = num
return result
}
}
let type = A.self
type.calssFunc()
let typeB = B.self
typeB.calssFunc()
let objectA = A()
objectA.num = 100
let newObjectA = objectA.copy()
objectA.num = 1
let objectB = B()
objectB.num = 100
let newB = objectB.copy()
這個(gè)例子中有兩個(gè)類A和B,A實(shí)現(xiàn)了協(xié)議中的兩個(gè)方法并包含一個(gè)類方法士聪,B是A的子類,它也實(shí)現(xiàn)了協(xié)議的方法猛蔽。
可以看到對(duì)于A來說
A的實(shí)例方法中self表示當(dāng)前實(shí)例剥悟,利用type(of: self)獲取當(dāng)前對(duì)象的類型灵寺,
A的類方法中self就表示當(dāng)前類的類型,而Self則只能用來表示返回值的類型区岗。
對(duì)比A和B所實(shí)現(xiàn)的協(xié)議的方法可以看出在協(xié)議中的方法接收的參數(shù)類型必須換成各自類的類型略板,否則會(huì)報(bào)文章開頭的那個(gè)錯(cuò)誤。
怎么用
綜上可看出對(duì)于Self來說它只是表示特定類型慈缔,并且只能用在協(xié)議中或者作為某個(gè)類的方法的返回值類型蚯根,而self在實(shí)例方法中代指當(dāng)前實(shí)例,在類方法中則代指當(dāng)前類胀糜。