使用 "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"
}
我是 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"
}