【问题标题】:Swift Protocol Function: returning the same type of conforming classSwift 协议函数:返回相同类型的一致性类
【发布时间】: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
   }
}

有可能吗?

【问题讨论】:

    标签: swift swift-protocols


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多