【问题标题】:Swift: Type does not conform to generic protocolSwift:类型不符合通用协议
【发布时间】:2018-03-28 20:16:01
【问题描述】:

我对 swift 通用协议有一个奇怪的问题。这是我的示例代码:

protocol A {
    var s: String? { get }
}

protocol B: A {
    var d: Int? { get }
}

protocol Aed {
    associatedtype T: A

    var a: T! { get }
}

class AClass: Aed {
    var a: B!
}

在线class AClass: Aed { 我收到错误type 'AClass' does not conform to protocol 'Aed'。我不明白为什么swift无法推断a的类型,看起来很简单,不是吗?

【问题讨论】:

    标签: swift generics protocols type-inference


    【解决方案1】:

    你不能这样做的原因似乎是一样的:

    protocol A {
        var s: String? { get }
    }
    
    protocol B: A {
        var d: Int? { get }
    }
    
    class AClass<T: A> {
        var a: T!
    }
    
    class BClass: AClass<B> {
    }
    

    这里 swift 给出错误using 'B' as a concrete type conforming to protocol 'A' is not supported。 Swift 不支持使用协议作为泛型约束的类型。你需要提供具体的实现。

    【讨论】:

    • 有关该主题的更多信息,请参阅stackoverflow.com/questions/33112559/…。潜在的问题是协议不符合它们自己(也不符合它们的超类型)。您将需要找到另一种方法。
    【解决方案2】:
    protocol A {
        var s: String? { get }
    }
    
    protocol B: A {
        var d: Int? { get }
    }
    
    protocol Aed {
        associatedtype T: A
    
        var a: T! { get }
    }
    
    class AClass<Element:B>: Aed {
        typealias T = Element
    
        var a: Element!
    
    }
    
    
    // usage
    class MyElement: B {
        var d: Int?
    
        var s: String?
    }
    
    var myElement = MyElement()
    
    myElement.d = 100
    
    myElement.s = "hello"
    
    var anInstance = AClass<MyElement>()
    
    anInstance.a = myElement
    
    print(anInstance.a.d ?? 0) // 100
    print(anInstance.a.s ?? "") // hello
    

    【讨论】:

    • 我之前来过这个,但这不是一个好的解决方案。起初它迫使我拥有泛型类型,如果我可以拥有最终类。其次,我无论如何都需要在创建实例时指定类型,这不是我想要的。我希望仅在分配期间指定类型,因此我可以将协议公开并在内部实现。最后但并非最不重要的一点是,如果我的类型是 ViewController,并且我想在界面生成器中使用它,我不能使它成为通用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多