使用 "member" 获取 Set 中的一个元素

Get an element in a Set with "member"

我是 Swift 的新手,我正在尝试将一段 Objective-C 代码重写成 Swift 语言。原始代码是修改一个集合中的一个元素:

@property (nonatomic, strong, nonnull) NSMutableSet<CustomItem *> *itemsSet;
...

CustomItem *item = [[CustomItem alloc] initWithSomething:something];
CustomItem *existingItem = [self.itemsSet member:item];
if (existingItem) {
    existingItem.property = 3
}

Swift 代码如下所示:

var itemsSet = Set<CustomItem>()
...

let item = CustomItem(something: something)
let existingItem = self.itemsSet...?

是否可以使用 Swift 以类似方式获取 Set 的元素?

很遗憾,我不知道为什么这没有按预期工作。我会假设 Swift Set 也有一个 member 函数 - 显然它 没有 .

Swift 模块的文档中写了以下内容:

/// A shadow for the "core operations" of NSSet.
///
/// Covers a set of operations everyone needs to implement in order to
/// be a useful `NSSet` subclass.
@objc public protocol _NSSetCoreType : _NSCopyingType, _NSFastEnumerationType {
    public init(objects: UnsafePointer<AnyObject?>, count: Int)
    public var count: Int { get }
    public func member(object: AnyObject) -> AnyObject?
    public func objectEnumerator() -> _NSEnumeratorType
    public func copyWithZone(zone: _SwiftNSZone) -> AnyObject
    public func countByEnumeratingWithState(state: UnsafeMutablePointer<_SwiftNSFastEnumerationState>, objects: UnsafeMutablePointer<AnyObject>, count: Int) -> Int
}

听起来 Swift 中没有所有这些功能(我对这个可能是错的,但它似乎是真的)。​​

一个解决方法是使用 NSMutableSet(与 Objective-C 中的类型相同):

var itemsSet : NSMutableSet = NSMutableSet()
itemsSet.addObject("bla")
let existingItem = itemsSet.member("bla")

另一种是写的代码稍微多一点,但停留在"Swift territory":

let item = CustomItem(something: "")
if let index = itemsSet.indexOf(item) {
    let existingItem = itemsSet[index]
    existingItem.something = "somethingElse"
}

使用 indexOf() 和下标——如 luk2302 的回答中所建议的—— 对我来说似乎是一个很好的快速解决方案。

但为了完整起见:您可以使用member() NSSet 的方法,你只需要将 Set 转换为 NSSet 明确地:

if let existingItem = (itemsSet as NSSet).member(item) as? CustomItem {
    existingItem.something = "somethingElse"
}