Swift

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動
Wikipedia
ウィキペディアSwiftの記事があります。

メインページ > 工学 > 情報技術 > プログラミング > Swift

Swiftとは、Appleが作成したオープンソースのプログラミング言語である。なお、iPadアプリ 「Swift Playgrounds」では、子供向けにSwiftの基本を解説している。

文法[編集]

定数と変数[編集]

定数はletキーワードで、変数はvarキーワードによって宣言する。変数は値の再代入が可能だが、定数は後から値を変更することはできない。

let 定数名:  = 
var 変数名:  = 

型推論が可能な場合には型の記述を省略できる。

let pi: Double = 3.141592
let pi = 3.141592  // 型名を省略する

なお、いかなる数値型の変数についても暗黙の型変換(cast)が行われることはなく、型の違う数値同士の演算、右辺と左辺で型の異なる代入は全てコンパイルエラーとなる。一方、数値リテラルについては、整数型から浮動小数点型への暗黙の型変換が行われることがある。

let intValue: Int = 1
let uintValue: UInt = intValue          // コンパイルエラー
let intValue2: Int = intValue + 1.0     // コンパイルエラー

基本データ型[編集]

配列[編集]

var arrayOfChars: [Character] // 宣言のみ
var arrayOfInts = [Int]() // 空の配列として初期化
let fibs = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] // [Int]
let transcendentals = [ 2.7182818284590451, 3.1415926535897931 ] // [Double]
let falsies = [false, 0, 0.0, ""] // [Any] 型の混在

辞書[編集]

var name2num = [String:Int]()
name2num["zero"] = 0
name2num["one"]  = 1
let name2num = ["zero":0, "one":1, "two":2] // Dictionary<String, Int>

タプル[編集]

let errorStatus: (Int, String) = (404, "Not Found")
let errorStatus = (404, "Not Found")

Optional型[編集]

Swiftでは安全性のため、ある型の定数や変数にnilを代入することは禁止されている。

変数にnilを代入可能にするには、Optional型でラップする。任意の型のOptional型は、ラップしたい型名の後ろに"?"を付けて表す。

var n: Int = nil  // コンパイルエラー
var m: Int? = nil // Optional型はnilを代入可能
var l: Optional<Int> = nil // Int? は Optional<Int> の略記である
var o:Int! = nil // 暗黙的開示Optional型。自動的に強制アンラップされるが、nilの場合に実行時エラーとなる
var p:ImplicitlyUnwrappedOptional<Int> = nil // Int? は ImplicitlyUnwrappedOptional<Int> の略記である
// 文字列の配列の中から指定した文字列を探す関数
func findString(data: [String], key: String) -> Int? {
    for index in 0..<data.count {
        if data[index] == key {
            return index
        }
    }
    return nil
}

Optional<Type>型の値からType型の値を取り出すことを、アンラップするという。

Optional型の値を強制的にアンラップするには、値のうしろに"!"を付ける。アンラップしようとした値がnilの場合は実行時エラーが発生する。

let fruits = ["apple", "banana", "orange"]
let possibleKiwiIndex = findString(data:fruits, key:"kiwi") // Int?型

if possibleKiwiIndex != nil {
    let kiwiIndex = possibleKiwiIndex!
    print("キウイは\(kiwiIndex)番目に見つかりました")
} else {
    print("キウイは見つかりませんでした")
}

if文とwhile文ではOptional束縛(optional binding)を記述できる。

if let kiwiIndex = find(fruits, "kiwi") {
    print("キウイは\(kiwiIndex)番目に見つかりました")
} else {
    print("キウイは見つかりませんでした")
}

Optional型の変数のメソッドやプロパティを呼び出す際には、Optional Chainingを記述できる。

var possibleOrangeIndex = findString(data:fruits, key:"orange")

if possibleOrangeIndex?.distance(to:1).signum() == -1 {
    print("オレンジは2番目より後にあります")
}
var path:String? = "/path/to/an/invisible/.file"
var isInvisible = path?.split(separator:"/").last?.hasPrefix(".")
print(isInvisible) // Optional(true)

制御構造[編集]

帰結節や繰り返す文は(ブレースで囲まれた)複文(ブロック)でなければならない。条件式を囲む括弧は不要である。

条件式に書けるのはBool型かBool型の式か、BooleanTypeプロトコルを実装する型でなければならない。

if文[編集]

 if 条件式1 {
     1
 } else if 条件式2 {
     2
 } else {
     3
 }

switch文[編集]

数値だけでなくあらゆるオブジェクトによって分岐することができる。また暗黙的にブレークされ、fallthroughキーワードがある場合に限り、次のcase文にフォールスルーする。

switch  {
case パターン1:
    println("case 1")
    //暗黙的にbreakされる
case パターン2, パターン3:  //複数条件
    print("case 2 or 3")
case パターン4 where 条件式: // where 条件式でパターンに制限を加える事が出来る
    print("case 4")
    fallthrough // フォールスルー
default:
    print("default")
}

for/for-in文[編集]

let names = ["太郎", "花子", "一郎"]
for name in names {
    print("\(name)さん、こんにちは!")
}
 for index in 0..<5 {
     print("index: \(index)")
 }

while/repeat-while文[編集]

 while 条件式 {
     
 }
 repeat {
     
 } while 条件式

関数とクロージャ[編集]

関数とクロージャは第一級関数であり、普通のオブジェクトと同じように変数に入れたり、関数の引数や戻り値として受け渡しできる。

関数[編集]

func calcBMI(weight: Double, height: Double) -> Double {
    return weight / (height * height) * 10000
}
外部引数名[編集]

関数の引数には外部引数名(external parameter name)を指定することができる。対して関数内部のみで使用できる引数名はローカル引数名(local parameter names)と呼ぶ。

func calcBMI(weight w: Double, height h: Double) -> Double {
    return w / (h * h) * 10000
}

calcBMI(weight: 60, height: 160)  // 23.4375
func calcBMI(#weight: Double, #height: Double) -> Double { // 外部引数名とローカル引数名が同じならば、短縮形を使うことができる
    return weight / (height * height) * 10000
}

calcBMI(weight: 60, height: 160)  // 23.4375
可変長引数[編集]
func maxInt(first: Int, rest: Int...) -> Int {
    var max = first
    for num in rest {
        if max < num {
            max = num
        }
    }

    return max
}

maxInt(7, 3, 5, 9, 2)  // 9
maxInt(6)  // 6
デフォルト引数[編集]
func sayHello(name: String = "world") {
    print("Hello, \(name)!")
}

sayHello()               // Hello, world!
sayHello(name: "Swift")  // Hello, Swift!

クロージャ[編集]

Swiftでは中括弧{}で囲まれたコードブロックは事実上全てクロージャとなる。 このとき、引数・戻り値と、本体の処理の間に「in」を書くことで、この2つの部分を区別する。

[1, 2, 3].map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
    })

クロージャの型が推論可能な場合等では、各種省略記法を使用できる。

[1, 2, 3].map({
    number in
    let result = 3 * number
    return result
    })
[1, 2, 3].map({ number in 3 * number })
[1, 2, 3].map({ 3 * $0 })

外部リンク[編集]