Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 使Swift类符合需要init的协议_Cocoa_Swift_Protocols - Fatal编程技术网

Cocoa 使Swift类符合需要init的协议

Cocoa 使Swift类符合需要init的协议,cocoa,swift,protocols,Cocoa,Swift,Protocols,我在Swift中有以下协议: protocol FooConvertible{ typealias FooType init(foo: FooType) } 我可以使Swift类在类定义中符合它: class Bar: FooConvertible { var baz: String = "" required init(foo: String){ baz = foo } } 到目前为止还不错。但是,当我试图使一个类在扩展中与之一致时

我在
Swift
中有以下
协议

protocol FooConvertible{
    typealias FooType

    init(foo: FooType)
}
我可以使
Swift
类在类定义中符合它:

class Bar: FooConvertible {
    var baz: String = ""
    required init(foo: String){
        baz = foo
    }
}
到目前为止还不错。但是,当我试图使一个类在扩展中与之一致时,问题就出现了(对于Cocoa类,这是我唯一的选择,因为我没有源代码):

在该语言的以前版本中

它被移除的原因是什么


这意味着所有XXXLiteralConvertible协议都被禁止进入Cocoa类

您有没有可能尝试创建以下内容:

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
现在将知道
fooConverable
的所有初始化。
如果是这样,我很高兴能帮上忙。:)

这一事实已经被很清楚地解释了。它说你可以在Swift类中添加便利init,但不能在Cocoa类中添加便利init?你也不能这样做。你的例子没有编译。糟了,我在操场上直到现在才发现任何编译器错误。你说得对,我将修改这个问题。仅供参考,这里有一个关于
XXXLiteralConvertible
方面的讨论:
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
    }
}