2015-08-21 3 views
0

мне интересно, если я могу сделать что-то вроде этого:Могу ли я использовать кортежи с AnyObject?

override func someCocoaFunc(someParameter:AnyObject?) { 
    if let parameter = someParameter as! Tuple { 
     let parameterType = parameter.1 
     if parameterType == "Heads up, this is an Int" { 
      print(parameter.0 + 1) //prints 2 
     } 
     else { 
      //fallback 
     } 
    } 
} 
let myTuple = (1,"Heads up, this is an Int") 
someCocoaFunc(myTuple) 

Очевидно, что это не работает, потому что Кортеж не является классом, или по крайней мере не один я могу бросить в любом случае. Есть ли способ заставить это работать, если да, то как? Если нет, то какой способ определить тип AnyObject? Я пробовал:

if parameter is Bool { 
//some code 
} 
else if parameter is Int { 
//some code 
} 

Но это не похоже на работу, я думаю, потому что Bool просто typealias'd Int или что-то? Итак, чтобы обобщить, могу ли я использовать Tuples здесь, а если нет, что мне делать? Чтобы добавить некоторый контекст, я пишу один класс, который используется в разных целях для сервалов, поэтому я не могу быть уверен, что это будет за значение, просто это либо Int, либо Bool.

ответ

0

Вы не можете использовать кортежи здесь, потому что они сложные типы и, следовательно, не классы.

Проблема с if является то, что для совместимости Bool и Int преобразуются в NSNumber, который имеет boolValue и integerValue свойство, которое вызывается, если вы приводите их. Таким образом, 0 и 1 эквивалентны true и false и поэтому неоднозначны.

Как решение, которое я хотел бы предложить, чтобы сделать класс, который держит оба значения, как Optionals:

class Holder { 
    let boolValue: Bool? 
    let intValue: Int? 
} 
Смежные вопросы