2015-04-16 4 views
0

От CRToast я хочу написать в Swift (Это из CRToast example):NSDictionary представительство в Swift

NSDictionary *options = @{ 
          kCRToastTextKey : @"Hello World!", 
          kCRToastTextAlignmentKey : @(NSTextAlignmentCenter), 
          kCRToastBackgroundColorKey : [UIColor redColor], 
          kCRToastAnimationInTypeKey : @(CRToastAnimationTypeGravity), 
          kCRToastAnimationOutTypeKey : @(CRToastAnimationTypeGravity), 
          kCRToastAnimationInDirectionKey : @(CRToastAnimationDirectionLeft), 
          kCRToastAnimationOutDirectionKey : @(CRToastAnimationDirectionRight) 
          }; 

[CRToastManager showNotificationWithOptions:options 
          completionBlock:^{ 
           NSLog(@"Completed"); 
          }]; 

Вот мой Свифт представление первых строк:

var options:[NSObject:AnyObject] = [:] 
options[kCRToastTextKey] = "Hello World !" 
options[kCRToastTextAlignmentKey] = "\(NSTextAlignment.Center)" 
options[kCRToastBackgroundColorKey] = UIColor.redColor() 

CRToastManager.showNotificationWithOptions(options, completionBlock: {() -> Void in 
     println("done!") 
    }) 

Когда я компилирую и запускаю код, я получил следующую ошибку:

[CRToast] : ERROR given (Enum Value) for key kCRToastTextAlignmentKey was expecting Class __NSCFNumber but got Class Swift._NSContiguousString, passing default on instead 

Каков правильный перевод NSDictionary, представленный выше в Swift?

+0

Прежде всего, вам не нужны эти отдельные назначения. Вы также можете использовать литерал словаря в Swift. Теперь фактическая ошибка заключается в том, что API, по-видимому, ожидает «NSNumber» от значения, соответствующего ключу выравнивания текста, но вместо этого вы передаете ему строку. –

+0

@ TheParamagneticCroissant Когда вы посмотрите на пример здесь: https://github.com/cruffenach/CRToast#example, вы видите, что я так работаю в ObjectiveC. – confile

+0

um, о чем вы говорите? в этом примере нигде нет кода Swift ... и код Objective-C проходит в 'NSNumber', а также ваш код Swift. –

ответ

5

NSTextAlignment.Center является перечисление, внутренне представляется как целое число - но вы передаете его как строку:

options[kCRToastTextAlignmentKey] = "\(NSTextAlignment.Center)" 

тогда вы должны использовать перечислимую необработанное значение:

options[kCRToastTextAlignmentKey] = NSTextAlignment.Center.rawValue 
1

API, который вы используете, по-видимому, ожидает, что значение для перечисления выравнивания текста будет указано как NSNumber, а не как строка. (Что не удивительно - перечисления являются целыми числами (объективно-) С.)

Таким образом, вместо того, чтобы использовать интерполяцию строки, сделать NSNumber из значения перечисления в:

options[kCRToastTextAlignmentKey] = NSNumber(integer: NSTextAlignment.Center.rawValue) 

Кстати, вы дон Мне нужны все эти задания. В этом и заключается смысл использования словарного литерала. Вам не нужно делать словарь mutable тогда. Только сделайте это:

let options:[NSObject:AnyObject] = [ 
    kCRToastTextKey: "Hello World !", 
    kCRToastTextAlignmentKey: NSNumber(integer: NSTextAlignment.Center.rawValue), 
    kCRToastBackgroundColorKey: UIColor.redColor() 
] 
Смежные вопросы