gpt4 book ai didi

swift - 遵守协议(protocol)的误解

转载 作者:行者123 更新时间:2023-11-30 13:35:51 25 4
gpt4 key购买 nike

class SuperDelegate <T: AnyObject> {

func addDelegate(delegate: T)
{

}
}

我的问题是关于 T key,和id意思一样吗在 Objective-c 中?我的意思是关于使用情况。

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

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

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

最佳答案

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

You can call any Objective-C method and access any property on an AnyObject value without casting to a more specific class type. This includes Objective-C compatible methods and properties marked with the @objc attribute.

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

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

要实现您想要的目标,您需要编写:

class SuperDelegate {
func addDelegate(delegate: AnyObject)
{

}
}

但是 Swift 是一种强类型语言,通常情况下,您有一个委托(delegate)协议(protocol),并且您的类型的委托(delegate)遵守该委托(delegate)协议(protocol):

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()

关于swift - 遵守协议(protocol)的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36084370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com