2014-07-04 33 views
2

我沒有看到任何保證像Cocoa 這樣的Swift數組/集合成員的唯一性的方法。如果這是真的,那麼我想知道Swift和Cocoa還有什麼缺失?在Swift中創建獨特成員集合

我錯過了什麼,如果有的話?

+0

「字典」基本上起着一個集合的作用。 – newacct

回答

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) 
    } 
    // ... 
} 

因此,有我正在使用的NSMutableSet作爲保存通知觀察者,所以我可以做後面的內存管理的一種方式。沒問題。

但請注意,這只是在代碼中,我正在服用的是把它的頭和肩膀以上的Objective-C在我看來,斯威夫特功能優勢在於小片段:

  • 的的NSMutableSet屬性沒有在代碼中初始化(例如在初始化程序中,或在viewDidLoad中);當我宣佈它時我做對了。你不能在Objective-C中做到這一點。所以這是安全的;這個屬性永遠不會意外地爲零(有沒有發生過你?)。

  • 我使用function-in-function,這樣我就可以調用閉包並傳遞它。是的,你可以在Objective-C中做同樣的事情(給出一個塊的名字),但是這個語法更容易或者是什麼?每次使用它時,我都必須查找「命名閉包」語法;現在我花時間編寫代碼,而不是查找我無法編寫或閱讀的模糊語法。

事實上,只是片刻陣列堅持,有很多時候,當你有一個雨燕數組,但您需要將其轉換爲一個NSArray,或數組傳遞到可可的方法,它採用一個NSArray ,以便調用一些沒有Swift等效的基礎方法。這不是一個問題。

+0

我還應該提到Swift Array和Foundation NSArray之間的「橋樑」非常輕便。 – matt

+1

好吧......所以我想我錯過了學習Swift的要點,如果我可以用Obj-C來完成所有事情,那我現在就很滿意。 – SpokaneDude

+0

@ spokane-dude這是一個非常合理的問題,你當然可以單獨提出,但我認爲它不適合Stack Overflow,因爲它可能會被視爲「意見只」。 – matt

1

@matt說的是真的,從Objective-C使用NSSet沒什麼問題,因爲Apple已經很好地將Swift和Objective-C集成到同一個應用程序中。關於您的回覆,請記住Swift尚未完全發佈,未來版本中可能會有更多的API供我們使用,例如獨特的API,反射等等。這不應該阻止您學習Swift,以及Objective-C,所以不要放棄! :-)這對你來說可能是一件好事,可以向蘋果公司提供雷達;因爲我可以看到明確需要Swift中的類NSSet體系結構,並且如果有一天Objective-C會走到一邊,Swift需要一個獨立的API,而不是依賴於Objective-C的NSSet。

+0

那麼你是對的,你仍然可以使用NSSet,但是你失去了從Swift獲得的所有東西。您不能在NSSet中使用枚舉或結構。推出自己的Swift集合實現會更好 –