Swift の変数と定数の規定と型の設定や、更にInt8など固定ビット数型の整数、浮動小数点型などについて確認しておきましょう。
Xcode 13.4
Swift
Swiftはバージョンによって変更が繰り返されて改善されています。
Swiftを始めるにあったて基本的な確認です。
- 行でのコメントは’//’から始める
- /* */でくくると複数行をコメントアウトできる
- JavaやC系のような「;」は行末にはいりません
- = の左右が空白か、空白無しか合わせる必要があります
1 2 3 4 5 6 7 8 9 10 11 |
/* これはコメント */ // これもコメント // OK var str01 = "Hello Swift" var str02="Hello Swift" // Errors var str03= "Hello Swift" var str04 ="Hello Swift" |
変数: var の宣言
変数はその名の通り、その値が今後変わる可能性があるものです。
1 2 |
var str = "Hello Objective-C" str = "Hello Swift" |
定数: let
letを使うと値が変更されない定数となります。
1 |
let str = "Hello, playground" |
これを変数の時のように変えようとするとエラーになります。
1 2 |
let str = "Hello, playground" str = "Hello, Swift" |
「Cannot assign to value: ‘str’ is a ‘let’ constant」とエラー内容が表示されます。
この行番号の前に現れた赤丸をクリックすると
「Invalid redeclaration of ‘str’」というエラーになるだけのこともあります
letからvarに変えるとエラーが消えます。
なぜvarとletがあるのでしょう:
早い話がvarだけでもできそうです。変更あり変更無しをまとめてvarにしたいのですが、コンパイラが「これは変更されていないからletで宣言しませんか」的なコメントが出てきます。なぜでしょう
バグ対策:多分letを作ることで定数のつもりで作ったものを後で変数として使ってしまうというバグを発生させないということもあるのでしょう
Objective-Cとの互換:Objective-Cでは例えば要素数が固定の配列「NSArray」と要素を追加削除ができる「NSMutableArray」がありましたが、これをSwiftでやる場合はletとvarで宣言を分けることになります。このような互換性を考慮したのかもしれません。
型: type
以下の型が基本的なものになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 文字列 var member: String = "Yamada Taro" // 整数 var age: Int = 26 // Double: 64bitサイズの浮動小数点型 var height: Double = 182.4 // Float: 32bitサイズの浮動小数点型 var weight: Float = 88.3 // 真偽値 var isMan: Bool = true |
ところでSwiftでは型を推測してくれるため上の記述はFloat以外は簡略化できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 文字列 var member = "Yamada" // 整数 var age = 26 // Double: 64bitサイズの浮動小数点型 var height = 182.4 // Float: 32bitサイズの浮動小数点型 var weight: Float = 88.3 // 真偽値 var isMan = true |
逆に数値が後でわかる場合など変数を先に宣言することも可能です。この場合は型指定を明確にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var member: String member = "Yamada" var age: Int age = 26 var height: Double height = 182.4 var weight: Float weight = 88.3 var isMan:Bool isMan = true |
実は数値型にはもっと細かな種類がありますが、プログラムが初めてだと今はここまで覚えておけば大丈夫でしょう。
次は、ちょっと慣れてくれば出てくるものです。
整数型
数値型には整数と小数点で表され、bit数により3種類ありましたが、その中でも整数型についてもいくつか型が規程されています
- 整数:Int
- 浮動小数点数:Float, Double
Intには固定ビット数でのそれぞれの整数型があり、またその符号付、符号なし型があります。
- 符号付
- Int8, Int16, Int32, Int64
- 符号なし
- UInt8, UInt16, UInt32, UInt64
Int8の場合では、8bitの格納スペースでの整数ということですから
0000 0000 〜 1111 1111
までで表現可能な整数で符号±がつきますから
127 〜 -128
までの範囲の数値になります。
またUInt8は符号がないので
0〜 255
となります。これらをまとめると
型 | 最大値 | 最小値 |
Int8 | 128 | -128 |
Int16 | 32767 | -32768 |
Int32 | 2147483647 | -2147483648 |
Int64 | 9223372036854775807 | -9223372036854775808 |
Uint8 | 255 | 0 |
Uint16 | 65535 | 0 |
UInt32 | 4294967295 | 0 |
UInt64 | 18446744073709551615 | 0 |
これらの数値をプロパティを使って出力することができます。
1 2 3 4 5 6 7 8 |
let maxOfint64 = Int64.max print(maxOfint64) //9223372036854775807 let minOfint64 = Int64.min print(minOfint64) //-9223372036854775808 let maxOfuint64 = UInt64.max print(maxOfuint64) //18446744073709551615 |
ところで Int と UInt はどれだけの範囲になるのでしょうか
- 32bit環境であれば Int32、Uint32 と同じ
- 64bit環境であれば Int64, UInt64 となります。
Int8は8ビット幅の数値しか対応しないので、
こういう計算をすると、overflowのエラーになります。
1 2 3 4 |
let a: Int8 = 100 let b: Int8 = 100 let c = a * b // overflow |
これらビットタイプのIntは、bit演算、シフト演算、ローテート演算などbitでの計算や暗号化などに使われます。
ANDのビット演算の例:
1 2 3 4 5 6 |
// bit演算 let a: UInt8 = 252 // 1111 1100 let b: UInt8 = 63 // 0011 1111 let c: UInt8 = a & b // AND print(c) // 60 = 0011 1100 |
浮動小数点型
浮動小数点型にはFloatとDoubleがありますが、これもビット数に関係します。
Float | 32bit浮動小数点 |
Double | 64bit浮動小数点 |
Float32 | 32bit浮動小数点:Floatのエイリアス(別名) |
Float64 | 64bit浮動小数点:Doubleのエイリアス(別名) |
Float80 | 80bit浮動小数点 |
Float96 | 96bit浮動小数点 |
CGFloat | 32bit/64bit浮動小数点:環境による |
さて、Float80とかFloat96とかありますが、これは何でしょうか?
基本的にはHardwareがこのビット数に対応していないといけないようで、主にmacOS用のようです。
CPUがARMでは対応できないということなのでiOSでは使えないようです。(iOSとmacOSが統合という噂もあります)
実際にどのようなケースで使われるのか、おそらく桁数が必要な数学的、あるいは物理学的な用途で使われると推測できます。ただ浮動小数点の誤差があるのと、NSDecimalNumberを使う方ことで桁数オーバーには対処はできるとは思います。
尚、これ以外にOptional型というのがありますが、これは別の機会に
References:
Int – Swift Standard Library | Apple Developer Documentation
UInt – Swift Standard Library | Apple Developer Documentation
Float – Swift Standard Library | Apple Developer Documentation
Double – Swift Standard Library | Apple Developer Documentation
String – Swift Standard Library | Apple Developer Documentation
Bool – Swift Standard Library | Apple Developer Documentation