Swift可选协议要求

时间:2017-09-22 21:55:22

标签: swift protocols

我声明了以下协议。

SomeProtocol

现在,如果我想创建一个实现class SomeClass: SomeProtocol { var objA: ClassOfTypeAProtocol? var objB: ClassOfTypeBProtocol? } 的类,我会做到这一点

SomeProtocol

我现在面临的问题是,我希望能够在没有var objB: TypeB? { get set }的情况下创建实现objB的类。我希望content是可选的。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

在Objective-C中,您可以在协议中声明可选成员(方法/计算属性)。

在纯粹的Swift中,除非你使用@objc注释,否则这是不可能的(但在这种情况下,结构和枚举不能符合你的协议,所以它不是最好的方法)

那么,你怎么解决你的问题?

让SomeProtocol分成3个协议

这些是您的协议

protocol TypeAProtocol { }
protocol TypeBProtocol { }
protocol SomeProtocol {
    associatedtype TypeA: TypeAProtocol
    associatedtype TypeB: TypeBProtocol

    var objA: TypeA? { get set }
    var objB: TypeB? { get set }
}

现在我们将SomeProtocol拆分为3个协议

protocol SomeProtocolBase {
    associatedtype TypeA: TypeAProtocol
    associatedtype TypeB: TypeBProtocol
}
protocol SomeProtocolPartA: SomeProtocolBase {
    var objA: TypeA? { get set }
}

protocol SomeProtocolPartB: SomeProtocolBase {
    var objB: TypeB? { get set }
}

那是

现在你可以写

class ClassOfTypeAProtocol: TypeAProtocol { }
class ClassOfTypeBProtocol: TypeBProtocol { }

class SomeClass: SomeProtocolPartA {
    typealias TypeA = ClassOfTypeAProtocol
    typealias TypeB = ClassOfTypeBProtocol
    var objA: ClassOfTypeAProtocol?
}