Amarronの日記

iOSやMac、Web系の記事を書きます。

Swift 文法

f:id:Amarron:20141231160353j:plain

概要

Swiftの入門的な部分をまとめてみました。
初心者向けに文法の部分を中心に書きました。
また、SwiftObjective-Cより直感的ですっきりしているので、
iOSの開発を始めたい方はSwiftでの開発がオススメです。

目次

  1. 変数宣言(var,let)
  2. 型(Int,String...)
  3. 文字列操作
  4. 配列(Array)
  5. 辞書(Dictionary)
  6. タプル(Tuple)
  7. 繰り返し(for,while)
  8. 条件分岐(if,switch)
  9. 関数(func)
  10. クラスと構造体(class,struct)
  11. オプショナル型(Optional)
  12. おすすめの勉強法

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. おすすめの勉強法

  1. Swift - Overview - Apple Developerをざっくり読む
  2. The Swift Programing Languageを読む(Swift言語ブログが日本語で解説されていて分かりやすい)
    • A Swift Tour: Playground fileからSampleCodeをダウンロード(1.The Swift Programing Languageがplaygroundで閲覧出来る)
    • 気になる点をplaygroundで書く
  3. Using Swift with Cocoa and Objective-Cを読む(CocoaObjective-Cswiftの違いが書かれている)
  4. オススメの書籍

文法もわかりやすく、rssアプリを作成出来ます。基礎の入門書としてオススメです。

他に参考になる資料(2015.12追記)

その他

  • IBM Swift Sandbox(swiftがウェブプラザで動かせるサイト。マックを持ってないけど軽く触ってみたい人にオススメ。)