殿堂入り記事

新しいプログラミング言語 Swift

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Objective-Cに替わる新しいプログラミング言語Swiftの登場

WWDC2014で発表された新しいプログラミング言語Swiftでできることを紹介したいと思います。

screenshot 2014-06-03 4.09.07

今までとこれから

Swift使うとこんなにコードが短くなるぜという例です。

今まで

screenshot 2014-06-03 4.55.03

これから

screenshot 2014-06-03 4.55.10

確かにスマートですね。

言語ガイドをダウンロード

iBookでガイドを読めますのでダウンロードしてみましょう。

screenshot 2014-06-03 4.09.18

変数の宣言

varは変数、letは定数

var myVar = 42
myVar = 50
let myConst = 42

コントロール

if,switch,for-in,for,while,do-while

let individualScores = [76, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}

関数とクロージャ

funcで関数の定義と代入

関数を定義して

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

代入もできる。

func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

複数の戻り値

Object型に全てを詰めて返していた遠い記憶が今よみがえるw...

func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
    var vowels = 0, consonants = 0, others = 0
    for character in string {
        switch String(character).lowercaseString {
        case "a", "e", "i", "o", "u":
            ++vowels
        case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
        "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
            ++consonants
        default:
            ++others
        }
    }
    return (vowels, consonants, others)
}

let total = count("some arbitrary string!")

オブジェクトとクラス

クラス定義してインスタンス化して利用

class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

var shape = Shape()
shape.numberOfSides = 7

列挙型と構造型

enum Suit {
    case Spades, Hearts, Diamonds, Clubs
    func simpleDescription() -> String {
        switch self {
        case .Spades:
            return "spades"
        case .Hearts:
            return "hearts"
        case .Diamonds:
            return "diamonds"
        case .Clubs:
            return "clubs"
        }
    }
}
let hearts = Suit.Hearts

プロトコルと拡張

Javaでいうとインタフェースとアブストラクトに近いけど、プロパティを追加するとコンパイルエラーになるから違うかな。

protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}

extension Int: ExampleProtocol {
    var simpleDescription: String {
    return "The number \(self)"
    }
    mutating func adjust() {
        self += 42
    }
}
7.simpleDescription

型アノテーション

変数に意味を持たせることができます。

var welcomeMessage: String

型セーフ、型インタフェース

型推論

let meaningOfLife = 42
let pi = 3.14159
let anotherPi = 3 + 0.14159

タプル

let http404Error = (404, "Not Found")

アサーション

let age = -3
assert(age >= 0, "A person's age cannot be less than zero")

コレクション型

配列、辞書など

var shoppingList: String[] = ["Eggs", "Milk"]
var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]

サブスクリプト

構造内部の辞書型や列挙型のアクセス方法としてサブスクリプトを定義できます。

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
println("six times three is \(threeTimesTable[6])")

継承

class SomeClass: SomeSuperclass {
    // class definition goes here
}

class Bicycle: Vehicle {
    init() {
        super.init()
        numberOfWheels = 2
    }
}

オーバーライド

class Car: Vehicle {
    var speed: Double = 0.0
    init() {
        super.init()
        maxPassengers = 5
        numberOfWheels = 4
    }
    override func description() -> String {
        return super.description() + "; "
            + "traveling at \(speed) mph"
    }
}

getter/setter

getter/setterのオーバライドもできますね。

class SpeedLimitedCar: Car {
    override var speed: Double  {
    get {
        return super.speed
    }
    set {
        super.speed = min(newValue, 40.0)
    }
    }
}

イニシャライザ

initを使ってイニシャライザを呼びます

struct Color {
    let red = 0.0, green = 0.0, blue = 0.0
    init(red: Double, green: Double, blue: Double) {
        self.red   = red
        self.green = green
        self.blue  = blue
    }
}

let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)

型キャスト

asを使って型の判定を行えます。

for thing in things {
    switch thing {
    case 0 as Int:
        println("zero as an Int")
    case 0 as Double:
        println("zero as a Double")
    }
}

var things = Any[]()
 
things.append(0)
things.append(0.0)

ネストした型

struct BlackjackCard {
    
    // nested Suit enumeration
    enum Suit: Character {
        case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣"
    }
}

ジェネリクス

型指定の引数

func swapTwoInts(inout a: Int, inout b: Int)
func swapTwoValues<T>(inout a: T, inout b: T)

まとめ

どこかで見たことある書き方が多く、とても憶えやすそうな言語仕様ですね!

参考資料

Swift is an innovative new programming language