我想编写一个具有弱属性要求的协议。符合它的类必须能够为此属性指定任何类型。此外,我不想指定实际类型,因此它应该是使用某些协议指定的类型。这段代码显示了我对非弱属性的看法:
protocol ObjectProtocol: class {
typealias PropertyType
var property: PropertyType {get set}
}
protocol FirstPropertyProtocol: class {}
protocol SecondPropertyProtocol: class {}
class FirstObjectImpl: ObjectProtocol {
var property: FirstPropertyProtocol?
}
class SecondObjectImpl: ObjectProtocol {
var property: SecondPropertyProtocol?
}
它按预期工作。
我试图为弱属性做同样的事情:
protocol ObjectProtocol: class {
typealias WeakPropertyType: AnyObject //must be a class type
weak var weakProperty: WeakPropertyType? {get set}
}
protocol WeakPropertyProtocol: class {}
class ObjectImpl: ObjectProtocol {
weak var weakProperty: WeakPropertyProtocol?
}
我收到编译错误:
类型'ObjectImpl'不符合协议'ObjectProtocol'
有什么方法可以让我的工作吗?
答案 0 :(得分:4)
我不相信协议可以强制执行弱点。例如:
function pair(str) {
var finalArray = [];
var pushArray;
var lookup = {
G: "C",
C: "G",
A: "T",
T: "A"
};
for (var i=0; i<str.length; i++) {
pushArray = [];
pushArray[0] = str[i];
pushArray[1] = lookup[str[i]];
finalArray.push(pushArray);
}
return finalArray;
}
这些都编译正常,即使协议有protocol ObjectProtocol: class {
weak var weakProperty: AnyObject? {get set}
}
class ObjectImpl1: ObjectProtocol {
weak var weakProperty: AnyObject?
}
class ObjectImpl2: ObjectProtocol {
var weakProperty: AnyObject?
}
但ObjectImpl2没有实现它。
weak
此实现需要使用Any而不是AnyObject,因为WeakPropertyProtocol是一个协议而不是类。
或者这个?...
protocol ObjectProtocol: class {
typealias WeakPropertyType: Any //must be a class type
var weakProperty: WeakPropertyType? {get set}
}
protocol WeakPropertyProtocol: class {}
class ObjectImpl: ObjectProtocol {
typealias WeakPropertyType = WeakPropertyProtocol
weak var weakProperty: WeakPropertyProtocol?
}
无论哪种方式,我认为关键在于定义用于protocol WeakPropertyProtocol: class {}
protocol ObjectProtocol: class {
typealias WeakPropertyType: AnyObject //must be a class type
var weakProperty: WeakPropertyType? {get set}
}
class MyWeakClass: WeakPropertyProtocol {
}
class ObjectImpl: ObjectProtocol {
typealias WeakPropertyType = MyWeakClass
weak var weakProperty: MyWeakClass?
}
的类/协议。
答案 1 :(得分:3)
我使用WeakPropertyProtocol的@objc属性:
protocol ObjectProtocol: class {
typealias WeakPropertyType: AnyObject //must be a class type
weak var weakProperty: WeakPropertyType? {get set}
}
@objc protocol WeakPropertyProtocol {}
class SomeObjectImpl: ObjectProtocol {
weak var weakProperty: WeakPropertyProtocol?
}
这不是最佳解决方案,因为我关注来自apple doc
的这一说明另请注意,@ objc协议只能由类使用 继承自Objective-C类或其他@objc类。
我可以忍受这种限制,但我会感激任何更好的解决方案。
答案 2 :(得分:0)
Swift 4版本。
我需要我的视图模型符合协议。他们不得保留协调者对象:
protocol ViewModelType {
associatedtype CoordinatorType: AnyObject
weak var coordinator: CoordinatorType? { get }
}