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
。
答案 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
可能代表NSDate
或NSNumber
或任何其他类。
要达到你想要的效果,你需要写:
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()