37976


<https://stackoverflow.com/a/40312399/1979953>  
で見られるように、呼び出し側は`addAction(.cancel)`と書けます。

この`.cancel`のドットは何を表すドットなのでしょうか？  
なぜここにドットが書けるのでしょうか？（どういった文法でしょうか？）

**リンク先のソースの引用**

[code]

    /// App alert actions
    extension UIAlertAction {
        static var cancel: UIAlertAction {
            return UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
        }
        class func sharePhoto(handler: ((UIAlertAction) -> Void)?) -> UIAlertAction {
            return UIAlertAction(title: "Share", style: .Default, handler: handler)
        }
    }
    
[/code]

Use it like

[code]

    alertController.addAction(.cancel)
    
    alertController.addAction(.sharePhoto({ action in
        print(action)
    }))
    
[/code]


CC BY-SA 3.0
2017-09-15T14:13:20.707
37974
2017-09-27T14:06:32.937
2017-09-27T14:06:32.937
369
9008
question
swift ios swift3
UIAlertActionの拡張でよく見かけるドットは何を表すドット？ なぜここにドットが書ける？


その記法は、Swiftの[Implicit Member
Expression](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/swift/grammar/implicit-
member-expression)(定訳は知りませんが、ここでは「暗黙のメンバー参照式」としておきます)と呼ばれるものです。

> ### Implicit Member Expression
>
> An implicit member expression is an abbreviated way to access a member  
>  of a type, such as an enumeration case or a type method, in a context  
>  where type inference can determine the implied type.
>
>
> (拙訳)暗黙のメンバー参照式というのは、型のメンバーをアクセスする際の省略記法です。列挙型のケースや型メソッドなどを、型推論がその型を間違わずに判定できる場合に使用できます。

さらに意訳すると「型名が丸わかりの時は`型名.型メンバー名`と言う記法の`型名`の部分を省略して`.型メンバー名`と書いて良いですよ」と言うことです。

あなたの挙げられた例ですと、(`UIAlertController`の)`addAction(_:)`メソッドのパラメータが`UIAlertAction`であることがSwiftコンパイラーにはわかっているので、`UIAlertAction`の型プロパティで値型が`UIAlertAction`である`cancel`や、型メソッドで戻り値型が`UIAlertAction`である`share(handler:)`メソッドなどは、「型推論がその型を間違わずに判定できる場合」にあたるので、型名の部分を省略して記載できると言うことになります。

ちなみにリンク先のコードはSwift 2用に書かれているので、Swift 3だとこんな感じになります。

[code]

    extension UIAlertAction {
        static var cancel: UIAlertAction {
            return UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        }
        class func sharePhoto(handler: ((UIAlertAction) -> Void)?) -> UIAlertAction {
            return UIAlertAction(title: "Share", style: .default, handler: handler)
        }
    }
    
    alertController.addAction(.cancel)
    
    alertController.addAction(.sharePhoto { action in
        print(action)
    })
    
[/code]

これを暗黙のメンバー参照式を使わずに書くとこうなります。

[code]

    extension UIAlertAction {
        static var cancel: UIAlertAction {
            return UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil)
        }
        class func sharePhoto(handler: ((UIAlertAction) -> Void)?) -> UIAlertAction {
            return UIAlertAction(title: "Share", style: UIAlertActionStyle.default, handler: handler)
        }
    }
    
    alertController.addAction(UIAlertAction.cancel)
    
    alertController.addAction(UIAlertAction.sharePhoto { action in
        print(action)
    })
    
[/code]

* * *

Swiftではイニシャライザはクラスメソッドの一種のように扱えるので、例えばこんな書き方もできます。

[code]

    var array: [Int] = .init(repeating: 0, count: 256)
    
[/code]

省略せずに書くと

[code]

    var array: [Int] = [Int].init(repeating: 0, count: 256)
    
[/code]

このような場合の`.init`は普通書かないので、

[code]

    var array: [Int] = [Int](repeating: 0, count: 256)
    
[/code]

と言うのと同じです。

最後の例は蛇足と言うか、あまり見ない例なので多用すると混乱を招きそうですが、列挙型のケースや、列挙型っぽく使われる構造体の型プロパティでは大変よく使われる記法なので、覚えておかれた方が良いでしょう。


CC BY-SA 3.0
2017-09-15T15:27:53.990
37976
2017-09-15T15:27:53.990
2020-06-17T08:14:45.997
-1
13972
37974
answer