2015-07-12 2 views
2

В Swift 2, что именно изменилось в NSDictionary(objects, forKeys)(Objective-C: dictionaryWithObjects: forKeys :) создание?В Swift 2, что изменилось в NSDictionary?

Apple's prerelease documentation был особенно бесполезным, учитывая, что существует только код Obj-C. Несмотря на небольшое, но очевидное изменение в предоставленном фрагменте, я не говорю obj-c и пока не понял смысла изменения.

Вот код для вас, ребята:

videoDataOutput.videoSettings = NSDictionary(objects: NSNumber(kCVPixelFormatType_32BGRA), forKeys: (kCVPixelBufferPixelFormatTypeKey)) 
//Working old Swift code; missing argument for parameter 'count' in call on Swift 2 

+ (instancetype)dictionaryWithObjects:(NSArray *)objects 
           forKeys:(NSArray *)keys 
//Old Obj-C code 


+ (instancetype nonnull)dictionaryWithObjects:(NSArray<ObjectType> * nonnull)objects 
             forKeys:(NSArray<id<NSCopying>> * nonnull)keys 
//New Obj-C code 

Я читал в другом месте, что ненулевая должна способствовать совместимости с Swift, но как насчет <ObjectType>? А что такое id?

@Update Исправлен быстр код из NSDictionary(objectsAndKeys:) в NSDictionary(objects: , forKeys:)

+0

Как вы это исправить? NSDictionary (объект: kCVPixelFormatType_32BGRA as NSNumber, forKey: kCVPixelBufferPixelFormatTypeKey как NSString) дает мне «OSType» не конвертируется в «NSNumber» –

+0

@PauloCesar Я только что закончил использование литерала 'Dictionary', как объяснено в конце выбранного ответа –

+0

Это также дает мне ошибку на Xcode beta 5. В конце концов было просто исправить это: [kCVPixelBufferPixelFormatTypeKey: Int (kCVPixelFormatType_32BGRA)] –

ответ

3

Вы не используете +dictionaryWithObjects:forKeys:, вы используете +dictionaryWithObjectsAndKeys:. Это два разных метода. +dictionaryWithObjectsAndKeys: не поддерживается быстрым.

Использование +dictionaryWithObjects:forKeys: будет выглядеть следующим образом.

videoDataOutput.videoSettings = NSDictionary(objects: [NSNumber(integer: kCVPixelFormatType_32BGRA)], forKeys: [kCVPixelBufferPixelFormatTypeKey]) 

Примечание: я также необходимо изменить NSNumber(kCVPixelFormatType_32BGRA) к NSNumber(integer: kCVPixelFormatType_32BGRA)


Потому что у вас есть только одна запись в словаре, вы можете использовать +dictionaryWithObject:forKey:.

videoDataOutput.videoSettings = NSDictionary(object: kCVPixelFormatType_32BGRA as NSNumber, forKey: kCVPixelBufferPixelFormatTypeKey as NSString) 

Примечание 1: Я использовал kCVPixelFormatType_32BGRA as NSNumber вместо NSNumber(integer: kCVPixelFormatType_32BGRA)

Примечание 2: Я должен был использовать kCVPixelBufferPixelFormatTypeKey as NSString вместо просто kCVPixelBufferPixelFormatTypeKey.


Я думаю, что самый простой способ сделать это состоит в использовании Свифта Dictionary буквальным.

videoDataOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as NSString: kCVPixelFormatType_32BGRA] 
+0

Итак, 'NSDictionary (object: NSNumber (integer: kCVPixelFormatType_32BGRA), forKey: kCVPixelBufferPixelFormatTypeKey)' должен работать, правильно? –

+0

Нет, 'kCVPixelBufferPixelFormatTypeKey' имеет тип' CFString! '. Его нужно преобразовать в 'NSString'. Я использовал 'kCVPixelBufferPixelFormatTypeKey как NSString', но вы можете использовать' NSString (string: kCVPixelBufferPixelFormatTypeKey) ', если вам нравится этот синтаксис лучше. –

+0

@osuka_ Я думаю, что ответ Джеффри более точен, чем мой ответ. особенно в отношении предпочтительного быстрого синтаксиса. – luk2302

1

Там нет никаких реальных изменений в Obj-C программист. Это в основном для компилятора и, как вы сказали, для перекрестной совместимости с быстрым:

Вместо (NSArray *) теперь у вас есть (NSArray<ObjectType> * nonnull) что означает: а) массив может не ненулевая (не ноль) и б) его содержимое/значения должны быть типа ObjectType.

Вместо (NSArray *) у вас есть (NSArray<id<NSCopying>> * nonnull), что означает a), как указано выше, и b) его содержимое должно адаптировать протокол NSCopying.

Относительно expected count: objectsAndKeys больше не присутствует (docs), вы должны использовать некоторые другие функции. или просто дословный ...

Конечная нота относительно id и ObjectType: id относится к любому объекту, вы можете шалфей каждый вид или ARRA или что-нибудь в качестве id - он не имеет себе никакой информации типа. ObjectType Я думаю, относится к generics, это означает, что вы пишете ObjectType везде, где хотите использовать определенный тип, вы еще не знаете тип, но он будет таким же в каждом месте, где написано ObjectType.

+0

Я вставил неверный код Swift, мой плохой. Будет редактировать через пару минут. Я использовал 'objects:, forKeys:' вместо этого; код все еще сломан. Я все еще не могу понять, как переменные obj-c преобразуются в быстрые (или наоборот? Если да, то как мне обновить мой код Swift?) –

+0

@osuka_ Да, он останется сломанным, если вы его не исправите , вы должны указать параметр count. https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/#//apple_ref/occ/instm/NSDictionary/initWithObjects:forKeys:count: – luk2302

+0

Хорошо, это начало. Что я должен добавить? Я не использовал ни одного для Xcode 6 –

3

Я получил эту работу в XCode 7 Swift 2 используя просто

output.videoSettings = [ kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA) ] 

Проверьте этот проект в течение некоторого текущего кода https://github.com/gibachan/OpenCVSample/