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 协议函数:返回相同类型的一致性类的主要内容,如果未能解决你的问题,请参考以下文章

Swift21-协议

Swift21-协议

通过框架之间的扩展实现 Swift 协议一致性

Objective-C 类型的 Swift 2 协议扩展和一致性

重载和重写

OpenTok/TokBox 的 Swift 协议一致性错误