gpt4 book ai didi

objective-c - 如何在 Swift 中使用 NSSet(导出为 Set)?

转载 作者:行者123 更新时间:2023-11-28 08:32:33 24 4
gpt4 key购买 nike

我必须像这样满足在 Objective-C 中定义的协议(protocol)要求:

@protocol AProtocol <NSObject>
+ (NSSet<Class> * _Nullable)someClasses;
@end

我想在一个用 Swift 编写的子类中实现这个协议(protocol)。我想返回另一个对象的一组类。我要返回的类定义如下:

class B: NSObject {}

符合协议(protocol)的类定义如下:

class A: NSObject, AProtocol {
static func someClasses() -> Set<NSObject>? {
return [B.self]
}
}

为什么是NSSet<Class>桥接到 Set<NSObject>而不是设置?

这个解决方案崩溃了,我该如何解决这个问题?

最佳答案

NSSet<Class>桥接到 Set<NSObject>因为AnyClass不符合 Hashable这是 ValueType 的先决条件的 Set .

可以用NSObjectProtocol的以下扩展来解决:

extension NSObjectProtocol where Self: NSObject {
static var objcClass: NSObject {
return (self as AnyObject) as! NSObject
}
}

这将返回被转换为 NSObject 的对象的类.需要先投给AnyObject因为 Swift 的类型系统非常强大,直接将类型转换为实例类型时不会编译或给出警告。在 Objective-C 中这很好,因为 Class也只是一个对象。自 NSObject在 Objective-C 中实现,扩展仅适用于 NSObjectProtocol ,这可以节省使用(即使使用强制施法)。在 NSObjectProtocol 上实现扩展而不是 NSObject本身带来了不导出到Objective-C的积极效果。

关于objective-c - 如何在 Swift 中使用 NSSet<Class>(导出为 Set<NSObject>)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38586995/

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