Swift 文法
概要
Swiftの入門的な部分をまとめてみました。
初心者向けに文法の部分を中心に書きました。
また、SwiftはObjective-Cより直感的ですっきりしているので、
iOSの開発を始めたい方はSwiftでの開発がオススメです。
目次
- 変数宣言(var,let)
- 型(Int,String...)
- 文字列操作
- 配列(Array)
- 辞書(Dictionary)
- タプル(Tuple)
- 繰り返し(for,while)
- 条件分岐(if,switch)
- 関数(func)
- クラスと構造体(class,struct)
- オプショナル型(Optional)
- おすすめの勉強法
1. 変数宣言(var,let)
- 変数の宣言には「var」と「let」がある
- varは、変数
- letは、定数
// 型を指定して生成 var varInt:Int // 宣言:var 変数名:型 varInt = 0 // 代入:変数名=値 var varInt2:Int = 0 // 宣言+代入:var 変数名:型=値 // 型推論(型を指定せずに生成) var varInt3 = 3 // 値からInt型の変数が生成される let pi = 3.14 // let pi2:Double // 宣言のみだとエラー(値の代入も宣言時に必要) // pi = 3.1415926 // 値を変更するとエラー
2. 型(Int,String...)
- マイナス値がない「UInt」型がある
- 添字などで使うと安全性が高まる
- 型指定なしの「Any」型がある
名前 | 説明 |
---|---|
Int | 整数型 |
UInt | 符号なし整数型 |
Float | 単精度少数型 |
Double | 倍精度少数型 |
Bool | 論理型 |
Charecter | 文字型 |
String | 文字列型 |
Any | 型指定なし |
AnyObject | 型指定なし(Classに限定) |
3. 文字列操作
- Stringの文字列は「+」で結合できる
- var str:String = "Hello"+"World"
- String内に処理の実行結果を代入する時は「\(処理)」で出来る
- var str:String = "1+1=\(1+1)"
4. 配列(Array)
// 型を指定 var varArray:[String] // 型推論(型を指定せずに生成) var varArray2 = ["var0", "var1", "var2"] // 空の配列 var varArray3 = [String]() var varArray4:[String] = Array() // 要素の追加 varArray2.append("var3")
5. 辞書(Dictionary)
// 型を指定 var varDict:Dictionary<String, String> // 型推論(型を指定せずに生成) var varDict2 = ["key0":"var0", "key1":"var1", "key2":"var2"] // 空の辞書 var varDict3 = Dictionary<String, String>() var varDict4:Dictionary<String, String> = Dictionary() // 要素の追加 varDict2["key3"] = "var3" // 値の取得 if let value = varDict2["key3"] { print(value) } // キーと値の取得例 for (dictName, dictValue) in varDict2 { print("キーは\(dictName)で、値は\(dictValue)です。") }
6. タプル(Tuple)
- タプルは複数の値をグループとして扱える(「x,y,width,height」や「name,age」とかをグループにしたい時に便利)
- タプル内の値は、異なる型の値を設定出来る
// 値を設定 let http404Error = (404, "Not Found") // 値を取得 print("The status code is \(http404Error.0)") // 他の変数に設定、取得 let (statusCode, statusMessage) = http404Error print("The status code is \(statusCode)") // 変数名をつけて設定、取得 let http200Status = (statusCode: 200, description: "OK") print("The status code is \(http200Status.statusCode)")
7. 繰り返し(for,while)
var roopArray = ["var0","var1","var2"] // for-in ループ for i in 0..<roopArray.count { print(roopArray[i]) } // 条件文付きforループ for var i = 0; i < roopArray.count; i++ { print(roopArray[i]) } // 代入forループ for value in roopArray { print("\(value)") } // while var roopIndex = 0 while roopIndex < roopArray.count { print(roopArray[roopIndex]) roopIndex++ }
8. 条件分岐(if,switch)
- ifの条件式に()は、書かなくてもOK
- switchは、breakを書かなくてもbreakする
- switchでも、条件が複数指定できる
- switchでも、細かい条件も指定できる
var varStr:String = "Hello World" // if if varStr != "" { print(varStr) } // if条件分岐+代入 var varStr2:String? if let varStr3 = varStr2 { print(varStr3) // varStr2がnilじゃない場合、varStr3にvarStr2を代入 } else { print("varStr2 is nil") } // if条件分岐+代入(三項演算子) その2 var varInt:Int = 1 var varStr3:String = (1 == varInt) ? "1" : "" // switch 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)?" default: let vegetableComment = "Everything tastes good in soup." }
9. 関数(func)
- 戻り値が複数設定出来る
// 関数を呼び出す // func 関数名(引数: 型) -> 戻り値 func square(num: Int) -> Int { return num * num } // 関数を使う print("計算結果は\(square(2))です") // 引数が複数の場合、引数を「,」区切りで宣言 func sum(num1: Int, num2: Int) -> Int { return num1 + num2 } // 戻りが複数の場合、戻り値を「,」区切りで宣言 func tax(num: Float) -> (five: Float, eight: Float) { return (five: num*1.05, eight: num*1.08) } var taxPrice = tax(100.0) // 複数の戻りを取り出す場合、「.」で指定する print("消費税5%だと、\(taxPrice.five)円です") print("消費税8%だと、\(taxPrice.eight)円です")
10. クラスと構造体(class,struct)
- クラスと構造体は、変数や関数等をまとめたプログラム
- クラスと構造体の違いは、「型」として性質(セマンティクス)が異なる
- クラス(class):参照型(コピーした時に、コピー元の値を変更するとコピー先も同じものを参照しているので値が変わる)
- 構造体(struct):値型(コピーしてもそれぞれにインスタンスされる)
クラス(class)
- 本格的に作る場合に向いている
- 継承を使える
- ARCが使える
- インスタンスのライフサイクルが長いもに向いている
- 例)UIColor,UIImage等(殆どがクラス)
class RectClass { // 変数 var x: Float = 0 var y: Float = 0 var width: Float = 0 var height: Float = 0 // 関数 func maxX() -> Float { return x+width } func maxY() -> Float { return y+height } } var rectC = RectClass() rectC.x = 0; rectC.width = 100; print("最大幅は\(rectC.maxX())です");
構造体(struct)
- 軽く作る場合に向いている
- プロパティ数が少ないもに向いている
- 例)CGRext,CGPoint,CGSize,Array等
struct RectStruct { // 変数 var x: Float = 0 var y: Float = 0 var width: Float = 0 var height: Float = 0 // 関数 func maxX() -> Float { return x+width } func maxY() -> Float { return y+height } } var rect0 = RectStruct() var rect1 = RectStruct(x:0.0, y:0.0, width:100.0,height:200.0) print("最大幅は\(rect1.maxX())です");
11. オプショナル型(Optional)
- オプショナル型
- 「?」をつける
- nilになる可能性があることを示している
- ラップされた状態
- 非オプショナル型
- 「!」をつける
- nilになる可能性がないことを示している
- アンラップされた状態
- オプショナル連鎖
- オプショナル型のメソッドや変数にアクセスする時は、オプショナルでアクセスする必要がある
// NSURLクラスでの例 NSURL.h var scheme: String? { get } var host: String? { get } var path: String? { get } var query: String? { get } MyClass var url = NSURL(string: "http://www.apple.com")! var host: String? = url.host // ラップ var host2: String = url.host! // アンラップ // var host3: String = url.query // クエリーを設定していないので実行時エラーになる(宣言元にラップ状態の明示が必要) var host3: String? = url.query // host.hasPrefix("www") // オプショナル連鎖(?が必要) host?.hasPrefix("www")
12. おすすめの勉強法
- Swift - Overview - Apple Developerをざっくり読む
- The Swift Programing Languageを読む(Swift言語ブログが日本語で解説されていて分かりやすい)
- A Swift Tour: Playground fileからSampleCodeをダウンロード(1.The Swift Programing Languageがplaygroundで閲覧出来る)
- 気になる点をplaygroundで書く
- Using Swift with Cocoa and Objective-Cを読む(CocoaのObjective-Cとswiftの違いが書かれている)
- オススメの書籍
文法もわかりやすく、rssアプリを作成出来ます。基礎の入門書としてオススメです。
他に参考になる資料(2015.12追記)
- Swift.org(Swiftのコミュニティーのためのポータルサイト)
- Swift2 メモ(try catch、Availability、guard、defer等)
- プログラミング言語 Swift(はてな教科書)←初心者にかなりオススメ
- Swift での iOS アプリ開発(はてな教科書)←初心者にかなりオススメ
- Awesome-Swift-Education(Swiftを学習するためのキュレーションリスト)
その他
- IBM Swift Sandbox(swiftがウェブプラザで動かせるサイト。マックを持ってないけど軽く触ってみたい人にオススメ。)