看清楚哦亲,是Self不是self
直接上代码:
protocol IntervalType {
func clamp(intervalToClmap:Self) -> Self
}
这是什么鬼?
这么定义是因为我们不知道 未来谁要来实现IntervalType,而参数和返回类型不能写上具体值,
有同学说可以用IntervalType啊,是啊没错但是你调用时是不是得类型转换。。。。
如果我们希望在接口使用时的类型就是实现该接口本身的类型的话,就需要用Self进行指代
但是在这种情况下,Self不仅指代的是实现该接口的类型本身,也包括了这个类型的子类。
例如:
protocol Copyable {
func copy() -> Self
}
class MyClass : Copyable {
func copy() -> Self { //这时候Self代表MyClass
//但是这里我们该怎么写呢?return ?
}
}
你可能会写出这样的代码?
class MyClass : Copyable {
func copy() -> Self {
return MyClass()
}
}
你会得到一个编译时错误,因为该方法要求我们返回一个抽象的表示当前类型的Self,但是我们却返回了它的真实类型MyClass, 也许你觉得我们可以把方法的返回值Self改为MyClass,很快你又发现实现的方法和接口中的定义不一致,依然不能编译。
为了解决这个问题我们需要通过一个和上下文无关的,又能指代当前类型的方式初始化,那就是dynamicType.
func copy() -> Self {
let copyResult = self.dynamicType.init()
return copyResult
}
而对于MyClass的子类 即使不重写copy方法也能很好的工作。
网友评论