2014-09-08 5 views
2

Я пытался сделать это перевести Obj-C код для быстрого кода:Swift словарь Строить ошибку

NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithFloat: 44100.0],     AVSampleRateKey, 
           [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, 
           [NSNumber numberWithInt: 2],       AVNumberOfChannelsKey, 
           [NSNumber numberWithInt: AVAudioQualityMax],   AVEncoderAudioQualityKey, 
           nil]; 

// скор

var settings = [NSNumber.numberWithFloat(Float(44100.0)): AVSampleRateKey, 
      NSNumber.numberWithInt(Int32(kAudioFormatAppleLossless)): AVFormatIDKey, 
      NSNumber.numberWithInt(2): AVNumberOfChannelsKey, 
      NSNumber.numberWithInt(Int32(AVAudioQuality.Max)): AVEncoderAudioQualityKey]; 

Но я получаю сообщение об ошибке: Тип() не соответствует к протоколу «FloatLiteralConvertible»

Кто-нибудь знает, как исправить это? THX

+0

Сообщение об ошибке вводит в заблуждение, используйте ** NSNumber.numberWithInt (Int32 (AVAudioQuality.Max.toRaw())) **. – vladof81

ответ

5

В коде Swift имеется несколько ошибок.

  • Порядок ключей и значений неверен. В dictionaryWithObjectsAndKeys значения предшествуют ключам. Но Свифт словарь записывается как

    [ key1 : value1, key2 : value2, ... ] 
    
  • В NSNumber Инициализаторы сопоставляются Swift в

    NSNumber(float: ...), NSNumber(int: ...) 
    
  • AVAudioQuality.Max является enum. Чтобы получить базовое целочисленное значение, у вас есть , чтобы использовать .rawValue.

Это дает

var settings = [AVSampleRateKey : NSNumber(float: Float(44100.0)), 
    AVFormatIDKey : NSNumber(int: Int32(kAudioFormatAppleLossless)), 
    AVNumberOfChannelsKey : NSNumber(int: 2), 
    AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.Max.rawValue))]; 

Но номера автоматически упаковывается в NSNumber объекты, если это необходимо, так что вы можете упростить, что

var settings : [NSString : NSNumber ] = [AVSampleRateKey : 44100.0, 
    AVFormatIDKey : kAudioFormatAppleLossless, 
    AVNumberOfChannelsKey : 2, 
    AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue]; 

В Swift 2, тип kAudioFormatAppleLossless изменен на Int32, который является не мостиком NSNumber автоматически, так что вы должны изменить это

var settings : [NSString : NSNumber ] = [AVSampleRateKey : 44100.0, 
    AVFormatIDKey : Int(kAudioFormatAppleLossless), 
    AVNumberOfChannelsKey : 2, 
    AVEncoderAudioQualityKey : AVAudioQuality.Max.rawValue]; 
+0

Ах спасибо ТЕБЯ :) Я попробую завтра и отметьте ваш ответ тогда! – CPlusPlus

+0

Большое спасибо! простое решение! Единственное, что мне пришлось изменить, это AVFormatIDKey и использовал ваше первое решение 'AVFormatIDKey: NSNumber (int: Int32 (kAudioFormatAppleLossless))' –

+0

@GerritPost: Добро пожаловать. Тип kAudioFormatAppleLossless изменен в Swift 2, сравните http://stackoverflow.com/questions/32509565/how-to-resolve-type-of-expression-is-ambiguous-without-more-context-for-an-audio. –