はじめに
前回の記事を入稿した直後に、
前回はSwiftを学ぶための情報源の紹介と、
第2回の今回は、
変数(varとlet)
// Objective-C
NSInteger i = 0;
// Swift
var i = 0
Swiftの場合、
// Swift
var i : Int = 0
と言うように、
// Swift
let n = 10
のように、
// Objective-C
const NSInteger n = 10;
と同じですが、
Objective-Cでは明らかに定数の場合ぐらいしかconstを使いませんでしたが、
真偽値と数値
Int以外にも一般的な言語で提供されているような数値型が提供されています。
// Swift
var flag = true // Bool (BOOL)
var point : UInt = 100 // UInt (NSUInteger)
var star : float = 3.5 // float (float)
let pi = 3.141592 // Double (double)
上記のうち、
文字列(String)
Swiftに切り替えることの一番のメリットは、
// Objective-C
NSString *hello = @"Hello";
NSString *world = @"World";
NSString *helloWorld = [NSString stringWithFormat:@"%@, %@!", hello, world];
// Swift
let hello = "Hello"
let world = "World"
let helloWorld = "\(hello), \(world)!" // Hello, World!
まず文字列の先頭からアットマーク
もちろん、
// Swift
let helloWorld = hello + ", " + world + "!"
文字列はString型で、
このStringはNSStringと互換性があり、
// Swift
helloWorld.hasPrefix("Hello") // true
ちなみにご覧のとおり、
配列(Array)
配列もシンプルに扱えるようになりました。
// Objective-C
NSArray *array = @[@"abc", @"123"];
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"xyz", @"789", nil];
[mutableArray addObjectsFromArray:array]; // [@"xyz", @"789", @"abc", @"123"]
// Swift
let array = ["abc", "123"]
var mutableArray = ["xyz", "789"]
mutableArray += array // ["xyz", "789", "abc", "123"]
NSArrayとNSMutableArrayはArray型となり、
// Swift
let array1 : Array<String> = ["abc", "123"]
let array2 : [String] = ["abc", "123"]
となります。array1の宣言は、
実は、
// Objective-C
NSArray *array = @[@"abc", @123];
// Swift
let array = ["abc", 123] // Array<AnyObject>
また上記のように、
NSArrayとArrayは、
// Swift
let nsarray = NSArray(array: ["123", "abc"]) // NSArray
let array = Array(nsarray) // Array<AnyObject>
その他の便利なメソッドなどは、
辞書(Dictionary)
辞書も基本的には配列と同じ扱いです。
// Objective-C
NSMutableDictionary *numOfLegs = @{@"bird" : @2, @"dog" : @4, @"spider" : @8}.mutableCopy;
numOfLegs[@"fish"] = @0;
// Swift
var numOfLegs = ["bird": 2, "dog": 4, "spider": 8] // Dictionary<String, Int>
numOfLegs["fish"] = 0
表記はJSONに似た感じですが、
// Swift
var person = ["name": "taro", "age": 32, "married": true] // Dictionary<AnyObject>
ループ
他の言語と同様の for ループはもちろん使えます。
// Swift
for var i = 0 ; i < 10 ; i++ { // i = 0, 1, ..., 9
...
}
変数の定義
よりSwiftらしくするならば、
// Swift
for i in 0..<10 { // i = 0, 1, ..., 9
...
}
0..<10の表記は範囲
範囲の代わりに配列や辞書を指定することで、
// Swift
// Array
for value in ["bird", "dog", "spider"] {
...
}
// Dictionary
for (key, value) in ["bird": 2, "dog": 4, "spider": 8] {
...
}
辞書の場合は特殊で、
whileやdo whileなどは、
条件分岐
if文については目新しいものはないですが、
- case条件を複数列挙したり、
範囲で指定することができる。 - 文字列での比較が可能。
- breakを省略可能
(ただし1行も命令が無い場合は、 breakを記述する)。 - すべてのケースをカバーしないとコンパイルエラーとなる。カバーできていない場合はdefaultを記述する必要がある。
これら、
// Swift
let number = 11
var card = ""
switch number {
case 1:
card = "A" // breakは書かなくてOK
case 2...10: // 範囲での指定が可能
card = String(i)
case 11:
card = "J"
case 12:
card = "Q"
case 13:
card = "K"
default: // 全ての整数をカバーするために、defaultが必須
break // 1行も命令が無いのでbreakを記述
}
// card は "J" となる
// Swift
let card = "J"
var number = 0
switch card {
case "A", "a": // 列挙での指定が可能
number = 1
case "2"..."9", "10": // 範囲と列挙の組み合わせでの指定も可能
number = card.toInt()!
case "J", "j":
number = 11
case "Q", "q":
number = 12
case "K", "k":
number = 13
default:
break
}
// number は 11 となる
このように、
列挙型(enum)
列挙型も大幅に拡張されましたが、
// Swift
enum Color {
case Red
case Green
case Blue
}
caseの後にメンバを定義をします。Objective-Cのように、
// Swift
let color = Color.Green
var label = ""
switch color {
case .Red: // colorの型がColorと推定できるため、表記を省略できる。
label = "Red"
case .Green:
label = "Green"
case .Blue:
label = "Blue"
}
これが一番シンプルな使い方です。もちろん、
// Swift
enum Color : String {
case Red = "赤"
case Green = "緑"
case Blue = "青"
}
var label = Color.Green.rawValue // "緑"
割り当てた値を使うためには、
これ以外にも、
オプショナル型(Optional)
オプショナル型は、
まず、
var i = nil // コンパイルエラー
var j = 0
j = nil // コンパイルエラー
どうしてもnilを代入したい場合は、
var i : Optional<Int> = nil
var j : Optional<Int> = 0
j = nil
型はIntではなく、
var i : Int? = nil
var j : Int? = 0
j = nil
のように省略して書くことができます。おそらく、
では、
var i : Int = 1
var j : Int? = 2
i + j // コンパイルエラー
演算のところでコンパイルエラーとなります。これは、
i + j! // 3
Optional型の変数の後ろに
その1つの手法として下記のような記述ができます。ifの条件式で代入するとアンラップされ、
if let unwrapped_j = j { // 代入時にアンラップされ、nilの場合はfalseとなる
i + unwrapped_j
}
else {
i // jはnilだった
}
また、
i + (j ?? 0) // jがnilの場合には代わりに0として演算して、
// nilでなければアンラップする
この演算子はとても便利なのですが、
実はこれ以外にも、
こんなにも複雑なのにオプショナル型が採用されているのは、
次回は?
今回はSwift言語の基本的な仕様について、
Swiftには他にもいろいろな仕様がありますが、
次回は、