Swift 协议函数:返回相同类型的一致性类
Posted
技术标签:
【中文标题】Swift 协议函数:返回相同类型的一致性类【英文标题】:Swift Protocol Function: returning the same type of conforming class 【发布时间】:2016-06-14 15:52:01 【问题描述】:我想知道是否可以在 Swift 中完成类似 java(或 c++)的操作:
我有一个协议:
protocol Prot1
func returnMyself() -> Prot1
并且一个类符合协议Prot1
。
我可以强制函数returnMyself()
的返回类型与下面的类的类型相同吗?
class MyClass: Prot1
public func returnMyself() -> MyClass
return self
有可能吗?
【问题讨论】:
【参考方案1】:只需在您的协议中使用Self
protocol Prot1
func returnMyself() -> Prot1
这是一个例子
protocol Animal
func mySelf() -> Self
class Feline: Animal
func mySelf() -> Self
return self
class Cat: Feline
Feline().mySelf() // Feline
Cat().mySelf() // Cat
关于协议扩展
你也可以在这样的协议扩展中使用 Self
protocol Animal
extension Animal
func mySelf() -> Self
return self
现在一个类只需要像这样符合Animal
class Feline: Animal
class Cat: Feline
class Dog: Animal
并自动获取方法
Feline().mySelf() // Feline
Cat().mySelf() // Cat
Dog().mySelf() // Dog
更新
protocol ReadableInterval
class Interval: ReadableInterval
protocol ReadableEvent
associatedtype IntervalType: ReadableInterval
func getInterval() -> IntervalType
class Event: ReadableEvent
typealias IntervalType = Interval
func getInterval() -> Interval
return Interval()
【讨论】:
很好,我会为此使用关联类型。这更好。 @AMomchilov:谢谢! 我喜欢这种方法,但这是一个专门化的例子,如果我有 MyClass2 女巫也确认了 Prot1,我可以从 MyClass 专门化成员 func returnMyself() -> MyClass2 吗? @4bottiglie:当然!您也可以在MyClass2
中实现该方法。请记住添加 override
关键字并返回 MyClass2
。
我明白,但我的问题是是否有办法实现: func returnMyself() -> MyClass2 in MyClass not in MyClass2 ;不要问我为什么要这样做,这将消除我对专业的怀疑。【参考方案2】:
protocol Prot1
associatedtype T
func returnMyself() -> T
class MyClass : Prot1
typealias T = MyClass
func returnMyself() -> T
return self
【讨论】:
我喜欢你的风格;当您这样做时,关联的类型 T 将被限制为 Prot1 的子类: typealias T = MyClass?如果不是,这是一种限制它的方法? 一旦您执行typealias T = MyClass
,它将被限制为MyClass
。这意味着子类也必须实现func returnMyself() -> MyClass
以上是关于Swift 协议函数:返回相同类型的一致性类的主要内容,如果未能解决你的问题,请参考以下文章