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