NSNumber, содержащий Bool, легко спутать с другими типами, которые можно обернуть в класс NSNumber:
NSNumber(bool:true).boolValue // true
NSNumber(integer: 1).boolValue // true
NSNumber(integer: 1) as? Bool // true
NSNumber(bool:true) as? Int // 1
NSNumber(bool:true).isEqualToNumber(1) // true
NSNumber(integer: 1).isEqualToNumber(true) // true
Однако информация о его исходном типе сохраняется, как мы видим здесь:
NSNumber(bool:true).objCType.memory == 99 // true
NSNumber(bool:true).dynamicType.className() == "__NSCFBoolean" // true
NSNumber(bool:true).isEqualToValue(true) || NSNumber(bool:true).isEqualToValue(false) //true
Вопрос в том, какой из этих подходов является лучшим (и/или самым безопасным) подходом к определению того, когда Bool был заключен в NSNumber, а не во что-то еще? Все ли одинаково действительны? Или есть другое, лучшее решение?