具有关联类型

时间:2016-03-02 18:28:41

标签: ios swift

我想编写一个具有弱属性要求的协议。符合它的类必须能够为此属性指定任何类型。此外,我不想指定实际类型,因此它应该是使用某些协议指定的类型。这段代码显示了我对非弱属性的看法:

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'

有什么方法可以让我的工作吗?

3 个答案:

答案 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 }
}