NSNumberで扱われるSwiftの数値型

SwiftのIntやFloatのようなプリミティブな数値型をCやObjective-Cとで相互に扱う場合、その型は基本的に同じ値域の型で表されます。具体的には「Using Swift with Cocoa and Objective-C (Swift 2.1)」の「Interacting with C APIs」-「Primitive Types」にある、以下の表の通りです。

Cでの型 Swiftの型
_Bool,bool(C++) Bool, CBool
char, signed char Int8, CChar
unsigned char UInt8, CUnsignedChar
short Int16, CShort
unsigned short UInt16, CUnsignedShort
int Int32, CInt
unsigned int UInt32, CUnsignedInt
long Int, CLong
unsigned long UInt, CUnsignedLong
long long Int64, CLongLong
unsigned long long UInt64, CUnsignedLongLong
wchar_t UnicodeScalar, CWideChar
char16_t UInt16, CChar16
char32_t UnicodeScalar, CChar32
float Float, CFloat
double Double, CDouble

表の多くの項目で複数の型が書かれているのは、「C〜」で始まる型がそうでない型のtypealiasであるためです。

このように相互変換の可能な型が一通りそろっているものの、SwiftにはC言語にあるような暗黙の型変換がないため、Cの慣用的な型の考え方以上に型を強く意識すること(あるいはIntでまとめてしまうこと)が求められます。また、SwiftのIntはCのlong、CのintはSwiftだとInt32(またはCInt)に相当しているので混乱しないよう注意すべきです。

ところで、Objective-Cでは数値をオブジェクトとして扱うための型「NSNumber」があります。この型は、Swiftでは数値としてアンラップした状態で利用できます。「Using Swift with Cocoa and Objective-C (Swift 2.1)」から引用すると、以下の5つの型がNSNumberで扱われます。

  • Int
  • UInt
  • Float
  • Double
  • Bool