cocoa - 使 Swift 类符合需要 init 的协议(protocol)

标签 cocoa swift protocols

我在 Swift 中有以下协议(protocol):

protocol FooConvertible{
    typealias FooType

    init(foo: FooType)
}

我可以让 Swift 类在类定义中符合它:

class Bar: FooConvertible {
    var baz: String = ""
    required init(foo: String){
        baz = foo
    }
}

到目前为止一切顺利。但是,当我尝试在扩展中使一个类符合它时,问题就出现了(对于 Cocoa 类,这是我唯一的选择,因为我没有源代码):

class Baz {
    var baz = ""
}

extension Baz: FooConvertible{

    required convenience init(foo: String) { // Insists that this should be in the class definition
        baz = foo
    }
}

extension NSURL: FooConvertible{

    required convenience init(foo: String) { // this also fails for the same reason

    }
}

used to be possible , 在以前的语言版本中

它被删除的原因是什么?

这意味着 Cocoa 类禁止所有 XXXLiteralConvertible 协议(protocol)!

最佳答案

如果您尝试创建这样的东西:

protocol FooConvertible : class {
    typealias FooType

    var baz : String { get set } // protocol extensions inits may need to know this

    init(foo: FooType) // this is your designated initializer
}

extension FooConvertible {

    // init(foo: String) {
    //     self.init(foo: foo)
    //     baz = foo
    // }
    // you can't do this because it could call it self recursively 

    init(num: Int) { // this init will call your designated init and can instantiate correctly 
        self.init(foo: "\(num)")
    }
}

class Baz {
    var baz = ""
}

class Bar: FooConvertible {
    var baz: String = ""

    required init(foo: String) { // designated initializer
        baz = foo
    }
}

Baz 现在将知道 FooConvertible 的所有初始化。 如果是这样,我很高兴能提供帮助。 :)

关于cocoa - 使 Swift 类符合需要 init 的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876858/

相关文章:

c++ - 在 Cocoa/Objective-C 项目中包含 C++ 代码时出现未知类型名称 'class'

cocoa - 隐藏 NSView 溢出

swift - 如何在 UIPickerView 中加载从 Firestore 检索的数据?

algorithm - 具有相同输出的伪随机生成器

ios - 无法使用类型为 '*' 的参数列表调用 '' - Swift 泛型问题

cocoa - 将离线 NSView 捕获到 NSImage

iphone - NSObject 在 layoutSubviews 之后释放

swift - 如何获取WKWebView资源文件

ios - 如何以编程方式将 UISegmentedControl 添加到容器 View

arrays - 将符合多个协议(protocol)的类型转换为单个协议(protocol)