ios - Swift 协议(protocol)定义了一个不适用于 UIViewController 的 init

标签 ios swift uiviewcontroller protocols

这是一个简单的协议(protocol):

protocol StringsInitiable {
    init(strings: [String])
}

当约束到 NSObject 时,尝试在扩展中使用初始值设定项...

extension StringsInitiable where Self: NSObject {
    func test() {
        let _ = Self(strings: [])
    }
}

...但不是当约束到 UIViewController 时。然后它提示初始化器应该被标记为“编码器”,指的是 NSCoding 的强制初始化器。

extension StringsInitiable where Self: UIViewController {
    func test() {
        let _ = Self(strings: []) // error label 'strings:' expected 'coder:'
    }
}

即使是 UIViewController 子类,有没有办法使用协议(protocol)中声明的初始化程序?

编辑

它似乎在将扩展约束到基类(NSObject 或任何不继承任何东西的 Swift 类)时有效,但在将扩展约束到子类时却无效。

最佳答案

我不完全相信,但这闻起来像个错误。看看这个不编译的例子:

protocol P {
    init(n: Int)
}

class A {}

class B : A {}

extension P where Self : B {
    func f() -> Self {
        return Self(n: 3) // Error
    }
}

但是这样编译:

extension P where Self : A {
    func f() -> Self {
        return Self(n: 3)
    }
}

可能您无论如何都不想要一个协议(protocol),因为您甚至将其命名为 StringsViewController。您可能应该子类化 UIViewController:

class StringsViewController : UIViewController {
    convenience init(strings: [String]) {
        self.init()
    }
}

extension StringsViewController {
    func test() {
        let _ = StringsViewController(strings: [])
    }
}

或者如果你真的想要一个协议(protocol),你可以这样做:

protocol HasView {
    var view : UIView! { get }
}
protocol StringsInitable {
    init(strings: [String])
}

extension UIViewController : HasView {}

extension HasView where Self : StringsInitable {
    func test() {
        let n = Self(strings: [])
        print(n.view)
    }
}

关于ios - Swift 协议(protocol)定义了一个不适用于 UIViewController 的 init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059107/

相关文章:

ios - Mobile Safari - 等到 <video> 完全下载后再播放

ios - Swift Custom Cell 使用标签创建你自己的 Cell

swift - 预取相关对象的相关对象

swift - 有没有办法在 SwiftUI View 和与其间接相关的类之间设置一个全局变量?

iphone - iOS从 View Controller 访问 View 的变量

ios - 'Int' 与 'String' 不同 - Swift

ios - 如何使用按钮控件进行分页

ios - 最小单元格高度 - 自动布局

ios - 我怎样才能让 uiviewcontroller 在第一次运行应用程序时只可见一次(例如教程)?

objective-c - 如何从 imagePickerController 属性保存 UIImage