2014-07-04 2 views
2

Я не вижу никакого способа гарантировать уникальность членов массива Swift или коллекции, таких как Cocoa NSSet s. Если это правда, то интересно, чего еще не хватает в Swift, против Cocoa?Создание коллекций уникальных членов в Swift

Что мне недостает, если вообще?

+0

Словарь 'действует в основном как набор. – newacct

ответ

5

Что вам не хватает, так это то, что NSSet и остальная часть Foundation, Cocoa и т. Д. Все еще существуют и всегда будут.

EDIT: В 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 как способ хранения наблюдателей уведомлений, так что я могу сделать управление памятью позже. Нет проблем.

Заметим, однако, что как раз в этом маленьком фрагменте кода я воспользовавшись функциями Swift, которые ставят его на голову выше Objective-C, на мой взгляд:

  • Свойство NSMutableSet не имеет для инициализации в коде (например, в инициализаторе или в viewDidLoad); Я делаю это правильно, когда я заявляю об этом. Вы не можете сделать это в Objective-C. Так что это безопасно; это свойство никогда не будет случайно ничтожным (это когда-либо случалось с вами?).

  • Я использую функцию в функции, так что я могу оба вызвать замыкание и передать его. Да, вы можете сделать то же самое в Objective-C (дать блок имя), но этот синтаксис проще или что? Мне приходилось искать синтаксис «именованного закрытия» каждый раз, когда я его использовал; теперь я трачу свое время на написание кода, не глядя на неясный синтаксис, который я не могу писать или читать.

В самом деле, просто торчит с массивами на минуту, Есть много раз, когда у Вас есть Swift массив, но вы должны бросить его в NSArray, или передать массив в метод какао, который принимает NSArray , чтобы вызвать некоторый метод Foundation, который не имеет эквивалента Swift. Это не проблема.

+0

Я должен также упомянуть, что «мост» между Swift Array и Foundation NSArray чрезвычайно легкий. – matt

+1

OK ... так что я догадываюсь, что мне не хватает смысла изучать Свифта, если я могу сделать все с Obj-C, с которым я сейчас чувствую себя комфортно. – SpokaneDude

+0

@ spokane-dude Это очень разумный вопрос, и вы, конечно же, могли бы его разобрать отдельно, хотя я не думаю, что он окажется подходящим для Stack Overflow, поскольку он, вероятно, будет закрыт как «мнение только». – matt

1

Что говорит @matt, это правда, нет ничего плохого в использовании NSSet от Objective-C, так как Apple довольно хорошо умеет интегрировать Swift и Objective-C в одно и то же приложение. Что касается вашего ответа, помните, что Swift еще не полностью запекается, и в будущих выпусках может быть много API-интерфейсов, таких как уникальный набор API, отражение и т. Д. Это не должно мешать вам изучать Swift, а также Цель-C, так что не сдавайтесь! :-) Это может быть хорошей вещью для вас, чтобы подать радар с Apple on; поскольку я вижу определенную потребность в NSSet-подобной архитектуре в Swift, и если в какой-то день Objective-C будет на обочине, Swift понадобится для него автономный API, а не полагаться на NSSet Objective-C.

+0

Хорошо, что вы правы, что вы все еще можете использовать NSSet, но затем теряете все преимущества, которые вы получаете от Swift. Вы не можете использовать перечисления или структуры в NSSet. Гораздо лучше выполнить собственную реализацию Swift. –

Смежные вопросы