使一个Swift类符合要求init的协议

6

我在 Swift 中有以下的 协议

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

    }
}

以前版本的语言中,这是有可能的,可以查看此处

为什么会被移除呢?

这意味着所有XXXLiteralConvertible协议都被Cocoa类禁用了!


这个事实在文档中已经非常明确地说明了。 - CodaFi
在哪里说过你可以为Swift类添加方便初始化器但不能为Cocoa类添加? - cfischer
你不允许进行任何操作。你的示例无法编译。 - CodaFi
该死,直到现在我在 playground 中都没有得到任何编译器错误。 你是对的,我会修改问题。 - cfischer
请注意,devforums 上有关于 XXXLiteralConvertible 的讨论:Swift 1.1 中类的 StringLiteralConvertible - Mike S
1个回答

1

您是否正在尝试创建类似于这样的内容:

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的所有初始化程序。 如果是这样,我很高兴能够帮忙。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接