Objective-Cに替わる新しいプログラミング言語Swiftの登場 WWDC2014で発表された新しいプログラミング言語Swiftでできることを紹介したいと思います。
今までとこれから Swift使うとこんなにコードが短くなるぜという例です。
今まで
これから
確かにスマートですね。
言語ガイドをダウンロード iBookでガイドを読めますのでダウンロードしてみましょう。
変数の宣言 varは変数、letは定数
var myVar = 42myVar = 50let myConst = 42コントロール if,switch,for-in,for,while,do-while
let individualScores = [76, 43, 103, 87, 12]var teamScore = 0for 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 = 42let pi = 3.14159let anotherPi = 3 + 0.14159タプル let http404Error = (404, "Not Found")アサーション let age = -3assert(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