59115


`SwiftyUserDefaults`というオープンソースがあります。

<https://github.com/sunshinejr/SwiftyUserDefaults/blob/566ace16ee91242b61e2e9da6cdbe7dfdadd926c/README.md>

バージョン4のときは、

上記READMEにあるとおり

引用：

[code]

    extension DefaultsKeys {
        static let username = DefaultsKey<String?>("username")
        static let launchCount = DefaultsKey<Int>("launchCount", defaultValue: 0)
    }
    
    let username = Defaults[.username]
    Defaults[.hotkeyEnabled] = true
    
[/code]

という使い方だったのですが、

バージョン5では

<https://github.com/sunshinejr/SwiftyUserDefaults>

にある通り

引用：

[code]

    extension DefaultsKeys {
        var username: DefaultsKey<String?> { return .init("username") }
        var launchCount: DefaultsKey<Int> { return .init("launchCount", defaultValue: 0) }
    }
    
    // Get and set user defaults easily
    let username = Defaults[\.username]
    Defaults[\.hotkeyEnabled] = true
    
[/code]

と `\.` を使うようになっていました。 `\.` は何を意味するのでしょうか？


CC BY-SA 4.0
2019-09-17T04:25:54.633
59110
2019-09-17T06:35:54.727
2019-09-17T05:29:10.343
2238
9008
question
swift
\. は何を意味していますか？


`\.`は特別な意味をもつかもしれない`.`を`\`で抑止しているように見えます。


CC BY-SA 4.0
2019-09-17T05:30:03.970
59113
2019-09-17T06:12:23.803
2019-09-17T06:12:23.803
35558
35558
59110
answer


`\.username` は Swift 4 で導入された KeyPath だと思います。

Objective-Cやそれ以前のSwiftでもキーパスという概念はあり、使用することができましたが、  
それはキーパスを文字列として渡すので型安全性がないものでした。  
Swift 4 の KeyPath を使えば型安全性をコンパイラが保証することができるようになりました。

ちょっとした例

[code]

    struct User {
        let id: String
        let name: String
        let age: Int
    }
    
    var user = User(id: "1", name: "hoge", age: 20)
    
    let kp: AnyKeyPath = \User.id // 型を限定しないKeyPath型
    print(user[keyPath: kp]) // Optional("1")
    
    let kp2:PartialKeyPath<User> = \.name  // KeyPathの型が限定されていれば、型名を省略して \.〜 と記載できる
    print(user[keyPath: kp2]) // hoge
    
[/code]

SwiftyUserDefaults というライブラリについてはよく知りません。  
使用例の見た目だけだと、余計な `\` が増えているだけに見えますが、  
おそらくKeyPathを使うことでより型安全性が高まるなど、何らかのメリットがあって対応したのでしょう。


CC BY-SA 4.0
2019-09-17T06:35:54.727
59115
2019-09-17T06:35:54.727
23829
59110
answer