Swift5 のKeyPath キーワードについて勉強しましたので、メモします。
#KeyPathの定義
KeyPathの公式ドキュメントですが、理解できない。。。
https://developer.apple.com/documentation/swift/swift_standard_library/key-path_expressions
下記のリンクを参照しました。
https://qiita.com/BlueEventHorizon/items/dee0eb27fbba83ed8ea9
コード
1.struct
StudentModel.swift
struct StudentModel {
var studentId = "0"
var name = "new"
var age = "0"
}
2. keyPath確認
sample.swift(type)
public func confirmKeyPathType() {
var studentModel = StudentModel()
//keyPath 設定
let nameKeyPath = \StudentModel.name
print(" \(#function) keyPath type: \(String(describing: type(of: nameKeyPath)))")
}
上記の結果ログは下記の通り__WritableKeyPath__です。
confirmKeyPathType() keyPath type: WritableKeyPath
理由は下記の通りの属性のため
・KeyPath : ReadOnly
・WritableKeyPath : Read&Update
3. KeyPath 値更新
sample.swift(update)
var studentModel = StudentModel()
let nameKeyPath = \StudentModel.name
//keyPath 値更新
studentModel[keyPath: nameKeyPath ] = "updated"
4. Sort
sample.swift(array)
let array = [StudentModel(studentId: "003", name: "3", age: "10"),
StudentModel(studentId: "002", name: "1", age: "15"),
StudentModel(studentId: "001", name: "2", age: "20")]
KeyPathを利用し、ソート
sample.swift(Sort2)
let ageKeyPath = \StudentModel.age
let results = array.sorted {
$0[keyPath: ageKeyPath] > $1[keyPath: ageKeyPath]
}
print(" \(#function) 2.sorted result: \(results) ")
一般的なソート
sample.swift(Sort)
let results = array.sorted{ $0.age > $1.age }
print(" \(#function) 2.sorted result: \(results) ")
Github
おまけ
Sort と Sorted 差
KVO
observeがあれば、ごんな感じですかな?
ごめんなさい。次回調査します。
sample.swift(kvo)
let webview = UIWebView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
webview.observe(\UIWebView.pageLength, options: .new) {_,_ in
//handler
}
以上です。