/* ジェネリクス 型指定の引数 */ func swapTwoInts(a: inout Int, b: inout Int) { let c = a a = b b = c } var p = 1 var q = 2 swapTwoInts(a: &p, b: &q) print("p = \(p), q = \(q)") func swapTwoValues<T>(a: inout T, b: inout T) { let c = a a = b b = c } var r = 1.0 var s = 2.0 swapTwoValues(a: &p, b: &q) print("p = \(p), q = \(q)") swapTwoValues(a: &r, b: &s) print("r = \(r), s = \(s)") // 外部引数名省略 func swapTwoVal<T>(_ a: inout T, _ b: inout T) { let c = a a = b b = c } swapTwoVal(&p, &q) print("p = \(p), q = \(q)") swapTwoVal(&r, &s) print("r = \(r), s = \(s)")
イニシャライザ
/* イニシャライザ */ struct Color { // let red = 0.0, green = 0.0, blue = 0.0 // error: immutable value 'self.red' may only be initialized once let red, green, blue : Double 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)
getter/setter
/* getter/setter */ class SpeedLimitedCar: Car { override var speed: Double { get { return super.speed } set { super.speed = min(newValue, 40.0) } } } var limitCar = SpeedLimitedCar() limitCar.speed = 35.0 print(limitCar.description()) limitCar.speed = 60.0 print(limitCar.description())
オーバーライド
/* オーバーライド */ class Car: Vehicle { var speed: Double = 0.0 override init() { super.init() maxPassengers = 5 numberOfWheels = 4 } override func description() -> String { return super.description() + "; " + "traveling at \(speed) mph" } } var car = Car() print(car.description()) car.speed = 30.0 print(car.description())
継承
/* 継承 */ class Vehicle { var numberOfWheels: Int? var maxPassengers: Int? init() { } func description() -> String { // return "numberOfWheels = \(numberOfWheels), maxPassengers = \(maxPassengers)" // warning: string interpolation produces a debug description for an optional value; did you mean to make this explicit? return "numberOfWheels = \(numberOfWheels ?? 0), maxPassengers = \(maxPassengers ?? 0)" } } class Bicycle: Vehicle { // init() { // error: overriding declaration requires an 'override' keyword override init() { // error: overriding declaration requires an 'override' keyword super.init() numberOfWheels = 2 } }
構造内部の辞書型や列挙型のアクセス方法としてサブスクリプトを定義
/* サブスクリプト 構造内部の辞書型や列挙型のアクセス方法としてサブスクリプトを定義 */ struct TimesTable { let multiplier: Int subscript(index: Int) -> Int { return multiplier * index } } let threeTimesTable = TimesTable(multiplier: 3) print("six times three is \(threeTimesTable[6])")
コレクション型 配列、辞書など
/* コレクション型 配列、辞書など */ // var shoppingList: String[] = ["Eggs", "Milk"] // error: array types are now written with the brackets around the element type var shoppingList: [String] = ["Eggs", "Milk"] var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]