Self相当于oc中的instance
是什么
相信大家都知道self这个关键字的具体作用,它跟OC里的self基本一样。但是对于Self来说...(WTF,这是什么东西)
当你用错Self的时候编译器会这样提示
'Self' is only available in a protocol or as the result of a method in a class
分割开来的话就是两个意思
1.Self可以用于协议(protocol)中限制相关的类型
2.Self可以用于类(Class)中来充当方法的返回值类型
为什么
对于第一种情况,可以参考书中的例子
protocol Copyable {
func copy() -> Self
func clamp(intervalToClamp: Self) -> Self
}
在这个协议中的两个方法都用Self来对类型进行限制
第二种情况可以参考下面这个例子
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()
这个例子中有两个类A和B,A实现了协议中的两个方法并包含一个类方法,B是A的子类,它也实现了协议的方法。
可以看到对于A来说
A的实例方法中self表示当前实例,利用type(of: self)获取当前对象的类型,
A的类方法中self就表示当前类的类型,而Self则只能用来表示返回值的类型。
对比A和B所实现的协议的方法可以看出在协议中的方法接收的参数类型必须换成各自类的类型,否则会报文章开头的那个错误。
怎么用
综上可看出对于Self来说它只是表示特定类型,并且只能用在协议中或者作为某个类的方法的返回值类型,而self在实例方法中代指当前实例,在类方法中则代指当前类。
作者:周二可
------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。