在Swift中创建唯一成员集合

Spo*_*ude 2 cocoa nsset swift

我没有看到任何保证像Cocoa NSSet的Swift数组/集合成员的唯一性的方法.如果这是真的,那么我想知道Swift和Cocoa还缺少什么?

如果有什么我错过了什么?

mat*_*att 5

你缺少的是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等价的方法.这不是一个问题.