协议和类方法中的Self

// 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

}

你可能感兴趣的:(协议和类方法中的Self)