2016-03-31 4 views
1

Не могу понять, как лечить типы дженериков и как использовать аргументы с неопределенных типов с библиотеками:«Невозможно преобразовать значение типа„Т“...» в дженериков

func cellWith<T>(value: T) -> String {   // I expect Int, Double or String 
               // type value as argument 

    let fm = NSNumberFormatter()    // Double type argument will be 
    fm.numberStyle = .CurrencyStyle   // processed like "currency" 

    if value.self is Double {    // In case value have type "Double", 
              // like 20_000.00 
     return(fm.stringFromNumber(value)) // I expect return $20,000.00 
            ^~~~~ 
// ERROR: Cannot convert value of type 'T' to expected argument type 'NSNumber' 

    } else { 
     return("bla-bla-bla") 
    } 
} 
+2

Возможно, вы захотите использовать 'Any' вместо общего метода. Во всяком случае, вы делаете это быстро, делая это, если пусть doubleValue = значение as? Double {... use} '. См. Https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html – Kevin

+0

, он работает с 'return (fm.stringFromNumber (NSNumber (double: doubleValue))!). Я не знаю, но почему я должен развернуть значение String в конце? –

+0

Потому что 'stringFromNumber (_ :)' не гарантированно возвращает значение non-nil, но ваш метод есть. – avismara

ответ

0

Почему вам нужно использовать дженерики в этом случае? Используйте генерики только тогда, когда вам необходимо сохранить информацию о типе.

Использование дженериков только когда:

«вы собираетесь дать вам тип позже, и я хочу, чтобы вы применять этот тип везде я указать.»

Используйте Any только тогда, когда вы хотите, чтобы сообщить компилятору:

«Не беспокойтесь об этой переменной нет необходимости обеспечивать соблюдение любого типа здесь пусть мне делать все, что я хочу.»

С учетом этого ваш прецедент подходит ко второму. Вы не хотите возиться с дженериками здесь. Ваше решение должно идти:

func cellWith(value: Any) -> String { 
    let fm = NSNumberFormatter() 
    fm.numberStyle = .CurrencyStyle 
    if let doubleValue = value as? Double { 
     return(fm.stringFromNumber(doubleValue))! 
    } else { 
     return("bla-bla-bla") 
    } 
} 
+0

Не 'return (fm.stringFromNumber (doubleValue)) !, но' return (fm.stringFromNumber (doubleValue)!) ' –

+0

Оба они в порядке. Вы даже можете потерять внешние скобки. Он не применяется в Swift в отличие от других языков. :) – avismara

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