// public protocol NSObjectProtocol协议中定义的'self'返回类型是Self
// public func `self`() -> Self
/*
下面的这个方法,接受实现该协议的自身类型,并返回一个同样的类型
这么定义是因为协议其实本身是没有自己的上下文类型信息的,在声明协议的时候,我们并不知道最后究竟会是什么样的类型来实现这个协议,Swfit中也不能再协议中定义泛型进行限制。而在声明协议时,我们希望在协议中使用的类型就是实现协议本身的类型的话,就需要使用Self进行替代。
但是在这种情况下,Self不仅指代的是实现该协议的类型本身,也包括了这个类型的子类。
*/
//定义在协议中的一个方法func clamp(intervalToClamp: Self) -> Self
protocolCopyable {
funccopy() ->Self
}
classMyClass:Copyable{
funccopy() ->Self{
/*
let result = MyClass()
result.num = num
return result //编译错误,返回的是一个真实类型的,而不是抽象类型的Self
*/
letresult = type(of:self).init()//编译错误,提示需要required关键字类修饰init()
result.num=num
returnresult
/*
替代required init(){ }的方法是
:给当前类的声明前加上final关键字,告诉编译器我们不在会有子类来集成这个类型了
*/
}
requiredinit() {}
varnum =1
}