読者です 読者をやめる 読者になる 読者になる

Keep It Real BLOG

ソフトウェアエンジニア。1児の父。 酒、ラーメン、サッカー好き。旅行も好きですが、普段は出不精で大抵たまプラーザ界隈に居ます。

Swiftを始めてみて、個人的に違和感のある書き方まとめと雑感

iOS-Swift iOS

f:id:naohide_a:20151202194822p:plain 始めてSwiftに触れてみていますが、少し違和感感じる書き方がちょこちょこ出てきています。 まず手始めに、Appleのドキュメントに書いてあることから始めました。 そこで個人的に違和感を感じた箇所のまとめと、Swiftを触ってみた雑感を書き記しておきたいと思います。

var optionalName: String? = "John Appleseed"
var greeting ="Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

まず、上記の書き方ですが、if文で判定しつつ、定数に代入してます。 一見気持ち悪いような感じがしますが、optionalNameにnilが入っている場合、このif文内には入らないということです。

func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", day: "Tuesday")

関数の宣言方法ですが、パラメータは変数名と型を、返り値は型を宣言することになったようです。 Objective-cよりは分かりやすいかな。

func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
    var min = scores[0]
    var max = scores[0]
    var sum = 0
    
    for score in scores {
        if score > max {
            max = score
        } else if score < min {
            min = score
        }
        sum += score
    }
    
    return (min, max, sum)
}
let statistics = calculateStatistics([5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2)

tupleでも返せるようになったと。 これは便利そう!

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(42, 597, 12)

直接、配列を受け取ったりすることも。

func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}
returnFifteen()

クロージャ。

func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, condition: lessThanTen)

関数自体を変数として受け渡す例。 一瞬頭がフリーズしそうになった。関数自体を受け渡す際に、型名を合わせて宣言しないといけない模様。

var numbers = [20, 19, 7, 12]

numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
})

numbersの値を全て3倍したものがnumbersに代入されるという結果になる。 個人的には、let result = 3 * numberの部分をインデントすると、少ししっくり来る感じがする。

func repeatItem<Item>(item: Item, numberOfTimes: Int) -> [Item] {
    var result = [Item]()
    for _ in 0..<numberOfTimes {
        result.append(item)
    }
    return result
}
repeatItem("knock", numberOfTimes:4)

generics。型の制約を柔軟化出来る模様。 この場合、Itemという型を使用し、返り値もItemという型で返している。

ここまで一通り見て個人的には、型がしっかりしたことやoptionalでの?や!、またコロンが無くなったことが結構気に入っています。 それ以外は最後のgenericsが、まだ取っ付き難い印象です。

間違えている箇所等ありましたら、気軽にコメント頂けると幸いです。