A Swift Tourその1 – Simple ValuesとControl Flow
Swiftの言語仕様である「The Swift Programming Language」はとてもわかりやすいです。
この内容に沿って、playgroundを使って試していくと、Swiftが驚くほど理解できます。
playgroundではコードを書くと結果や変数の内容が右にすぐに出てくるのでとても使いやすいです。
まずは、お決まりの「Hello, world!」の表示から始めましょう。
println("Hello, world!") // Hello, world!
main関数は不要です。
行末のセミコロンは不要です。
Simple Values / 単純変数
var は変数(値の変更ができる)で、let は定数(値の変更ができない)です。
var myVariable = 42 // 変数 myVariable = 50 let myConstant = 42 // 定数
変数を初期化するときに値を与えると、コンパイラが型を推測してくれます。
myVariable は初期値が整数なので、integer型です。
初期値がなかったり、初期値が型を決定するのに十分でなかったら、変数の後にコロンをつけて型を指定します。
let implicitInteger = 70 // Integer型 let implicitDouble = 70.0 // Double型 let explicitDouble: Double = 70 // Double型(初期値は整数だが、型を明示的に指定)
暗黙的に型変換はできません。型変換したい型を明示的に指定する必要があります。
let label = "The width is " // String型 let width = 94 // Integer型 let widthLabel = label + String(width) // Integer型をString型に変換
文字列(String)に値を含めるにはもっと簡単な方法があります。
バックスラッシュ(\)に続けて、小かっこの中に値を入れます。
rubyの #{} に似ていますね。
let apples = 3 let oranges = 5 let appleSummary = "I have \(apples) apples" // 変数applesの値が代入されます。 let fruitSUmmary = "I have \(apples + oranges) pieces of fruit." // 演算もできます。
配列(array)や辞書(dictionary)を作るときは [] (大かっこ)を使います。
index や key を使って要素を取り出すことができます。
var shoppingList = ["catfish", "water", "tulips", "blue paint"] // 配列 shoppingList[1] = "bottle of water" // indexで要素取得 var occupations = [ // 辞書 "Malcolm": "Captain", "Kaylee": "Mechanic", ] occupations["Jayne"] = "Public Relations" // keyを指定して要素追加
空の配列や辞書を作るのはイニシャライザを使用します。
let emptyArray = [String]() // String型の配列 let emptyDictionary = [String: Float]() // keyがString型、valueがFloat型の辞書
型を指定しない場合は、以下のように書けます。
shoppingList = [] // 空の配列 occupations = [:] // 空の辞書
Control Flow / 制御フロー
条件式は if や switch、ループには for-in、for、while、do-while を使います。
let individualScores = [75, 43, 103, 87, 12] var teamScore = 0 for score in individualScores { if score > 50 { teamScore += 3 } else { teamScore += 1 } } teamScore // 11
if文はBooleanでないといけません。
if score { … } のように、0かどうかで判定をすることはできません。
値がないことがある場合には、if と let を一緒に使うことで判定できます。
Swiftには optional value というものがあります。
通常の変数には値に nil をとることはできませんが、optional value には nilが代入できるのです。
変数の型宣言の後にクエスチョンマーク(?)をつけると、optional value として扱われます。
optional valueは他の言語にはない、Swiftの独自性の一つになっています。
var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" // "Hello, John Appleseed" }
optinal value が nil だったら、条件式は false になります。
値があった場合は、let の後の定数に代入され、ブロックの中で変数として使用できます。
switch はどんな型にでも使用できます。
default の条件は必須です。
let vegetable = "red pepper" switch vegetable { case "celery": let vegetableComment = "Add some raisins and make ants on a log." case "cucumber", "watercress": let vegetableComment = "That would make a good tea sandwich." case let x where x.hasSuffix("pepper"): let vegetableComment = "Is it a spicy \(x)?" // "Is it a spicy red pepper?" default: let vegetableComment = "Everything tastes good in soup." }
定数のパターンにマッチした値の代入には let が使用されます。
caseにマッチしてその中の処理を実行した後はswitch文を終えますので、break は不要です。
for-in は辞書の各要素をとりだします。辞書内は順序は保証されません。
let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25], ] var largest = 0 for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } } } largest // 25
while は条件を満たさなくなるまで繰り返し実行します。
少なくとも1回は実行することがわかっていれば、条件式を最後に書くこともできます。
var n = 2 while n < 100 { n = n * 2 } n // 128 var m = 2 do { m = m * 2 } while m < 100 m // 128
ループ処理の中でindexが必要な場合は、..< でindexの範囲を指定するか、初期値・条件・インクルメントを書けばいいです。
以下の2つのループは同じ処理です。
var firstForLoop = 0 for i in 0..<4 { firstForLoop += i } firstForLoop // 6 var secondForLoop = 0 for var i = 0; i < 4; ++i { secondForLoop += i } secondForLoop // 6
上限を「未満(指定された値を含めない)」で指定する場合は ..< 、「以下(指定された値を含める)」で指定する場合は … を使用します。
「A Swift Tourその2」に続きます。
「The Swift Programming Language」で使用されているコードはplaygroundとしてダウンロードして、XCodeで開くことができます。
https://developer.apple.com/library/ios/swift_tour