我没有看到任何保证像Cocoa NSSet的Swift数组/集合成员的唯一性的方法.如果这是真的,那么我想知道Swift和Cocoa还缺少什么?
如果有什么我错过了什么?
你缺少的是NSSet和Foundation,Cocoa等的其余部分仍然存在并且永远存在.
编辑:在Swift 1.2中,Set是一个原生的Swift类型,你将使用它.
在需要时使用NSSet绝对没有错.这是我自己的代码中的一个例子:
class TracksViewController : UITableViewController {
// ...
var observers = NSMutableSet()
// ...
override func viewDidLayoutSubviews() {
func noteNowPlayingItem (note:NSNotification?) {
// ...
}
// do it now!
noteNowPlayingItem(nil)
// and do it later, when now playing item notification arrives
let ob = NSNotificationCenter.defaultCenter().addObserverForName(MPMusicPlayerControllerNowPlayingItemDidChangeNotification,
object: nil, queue: NSOperationQueue.mainQueue(),
usingBlock: noteNowPlayingItem)
self.observers.addObject(ob)
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
所以我使用NSMutableSet作为存储通知观察器的方式,以便我以后可以进行内存管理.没问题.
但是请注意,在我的一小段代码中,我正在利用Swift功能,在我看来,它优先于Objective-C:
NSMutableSet属性不必在代码中初始化(例如在初始化程序中或在viewDidLoad)中; 当我宣布它时,我就做对了.你不能在Objective-C中做到这一点.所以这是安全的; 这个属性永远不会是偶然的(有没有发生在你身上?).
我使用函数函数,这样我就可以调用一个闭包并传递它.是的,你可以在Objective-C中做同样的事情(给一个块一个名字),但这种语法更容易还是什么?每次我使用它时,我都必须查找"命名闭包"语法; 现在我花时间编写代码,而不是查找我无法编写或读取的模糊语法.
实际上,只是暂时坚持使用数组,有很多次你有一个Swift数组,但你需要将它转换为NSArray,或者将一个数组传递给一个接受NSArray的Cocoa方法,以便调用一些基础没有Swift等价的方法.这不是一个问题.