【问题标题】:Conform to a protocol misunderstanding符合协议误解
【发布时间】:2016-03-18 12:26:06
【问题描述】:
class SuperDelegate <T: AnyObject> {

  func addDelegate(delegate: T)
  {

  }
}

我的问题是关于T 键,它的含义是否与Objective-c 中的id 相同?我的意思是使用案例。

如何理解第一行 class SuperDelegate &lt;T: AnyObject&gt; 对不起,我是 Swift 新手。

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

- (void)addDelegate:(id)delegate 是一个属性id &lt;T&gt; delegate

【问题讨论】:

标签: swift swift2


【解决方案1】:

是的,你的假设是正确的,AnyObject behaves like id:

您可以调用任何 Objective-C 方法并访问对象上的任何属性 AnyObject 值,无需转换为更具体的类类型。这 包括与 Objective-C 兼容的方法和属性,标有 @objc 属性。

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

所以你的实例可以被实例化SuperDelegate&lt;AnyObject&gt;,但它也可以被实例化SuperDelegate&lt;NSDate&gt;。这意味着 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2017-07-11
    • 2019-10-14
    相关资源
    最近更新 更多