Swift

Apple Documentを読んで気になったところまとめ(welcome to swift)

More than 3 years have passed since last update.


functionの書き方のvariation一覧(多分既に何処かにある?)

・引数(argument)に変数を幾つかsetして、返り値が値の場合

func greet(name: String, day: String) -> String {

return "Hello \(name), today is \(day)."
}
greet("Bob", day: "Tuesday") // "Hello Bob, today is Tuesday."

・nestもあり

func returnFifteen() -> Int {

var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen() //15

・返り値が関数型の場合

func makeIncrementer() -> ((Int) -> Int) {

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

・引数に関数型を持つ場合

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) // true

・closure({})

numbers.map({

(number: Int) -> Int in // 引数 -> 返り値 をinで区切る
let result = 3 * number
return result
})

let mappedNumbers = numbers.map({ number in 3 * number })

print(mappedNumbers)

let sortedNumbers = numbers.sort { $0 > $1 }

print(sortedNumbers)


deinitするのはどういう時か?

デイニシャライザはクラスのインスタンスが破棄される時に自動的に呼ばれる特殊なメソッドです。

構造体にデイニシャライザはありません。

メモリに確保されたインスタンスやプロパティはARC(Automatic reference counting)によって自動的に破棄されるので 通常はデイニシャライザを記述する必要はありませんが、例えばファイルを扱うクラスで、開いたファイルをインスタンスの破棄時に確実に閉じるためにデイニシャライザを利用することができます。


stored property vs computed property vs type property


stored property(保持型プロパティ)

・willSet/didSetは、プロパティの状態監視をしたい時に用いる(当然、letには使えない)

lazyという修飾子をつければプロパティを使う時に初期値のsetをすることができる。(遅延ストアドプロパティ)

**遅延ストアドプロパティは、インスタンス生成時そのプロパティを必要せず、かつ、プロパティの初期化処理に時間を多く割いてしまう場合に使う


computed property

値を保持しない算出プロパティ

・varで宣言する

・プロパティ監視(willset/didset)は使えない

・lazyも使えない

・getterだけでも使える。getterのみの場合、getは省略可能

var center: Point {

get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
}
}


type property

特定の型それ自身に属するプロパティ

インスタンスを定義しなくても参照できる

Class.typePropertyStruct.typeProperty, Enum.typeProperty


mutating func とは?

メソッド内でインスタンスプロパティを変更する際には、そのメソッドを mutating として宣言する必要があります。

to mark a method that modifies the structure