符合协议误解

时间:2016-03-18 12:26:06

标签: swift swift2

class SuperDelegate <T: AnyObject> {

  func addDelegate(delegate: T)
  {

  }
}

我的问题是T密钥,它与Objective-c中的id是否相同?我是指用途的情况。

如何理解第一行class SuperDelegate <T: AnyObject>抱歉,我是Swift的新人。

作为我的Objective C程序,这一行意味着我们使类符合必须实现所有必需方法的协议。但我不明白func addDelegate(delegate: T)就像

一样

- (void)addDelegate:(id)delegate这是一个属性id <T> delegate

1 个答案:

答案 0 :(得分:0)

是的,您对AnyObject behaves like id

的假设是正确的
  

您可以调用任何Objective-C方法并访问任何属性   AnyObject值而不转换为更具体的类类型。这个   包括Objective-C兼容的方法和标有的属性   @objc属性。

但是你有used it here as a generic type而不是应该强制转换的具体类型。该类需要一个符合AnyObject协议的类型,但它并不强制它为AnyObject(参见头文件:cmd +点击Xcode中的AnyObject)。

因此,您的实例可以实例化SuperDelegate<AnyObject>,但也可以实例化SuperDelegate<NSDate>。这意味着ObjC方法和属性的整个子集无法得到保证,因为它们可以作为具体类型转换为AnyObject,因为在运行时T可能代表NSDateNSNumber或任何其他类。

要达到你想要的效果,你需要写:

class SuperDelegate {
    func addDelegate(delegate: AnyObject)
    {

    }
}

但Swift是一种强类型语言,通常情况下你有一个委托协议,并且你的类型的委托遵守了委托协议:

protocol DelegateProtocol {
    func somethingHappened()
}
struct MyTypeDelegate:DelegateProtocol {
    func somethingHappened() {
        print("Thanks for telling me!")
    }
}
struct MyType {
    var delegate:DelegateProtocol?
    func tellDelegateSomethingHappened() {
        delegate?.somethingHappened()
    }
}
let del = MyTypeDelegate()
var type = MyType()
type.delegate = del
type.tellDelegateSomethingHappened()