53786

[code]

    class Foo {
        var name = ""
    }
    
    class Hoge {
        let foo: Foo = {
            let foo = Foo()
            foo.name = "フー"
    
            return foo
        }()
    }
    
    Hoge().foo.name
    
[/code]

上記の`foo`インスタンス変数のようにいろいろな値を設定したオブジェクトを持ちたい場合

[code]

    = {
      // いろいろ設定してreturn
    }()
    
[/code]

という書き方を見ます。これはJavaScriptでいうところの無名関数の即時実行と同じと考えてよいのでしょうか？

<https://docs.swift.org/swift-book/LanguageGuide/Properties.html>  
にはこの記法が載っておらず、どういった文法なのかわからずにいます。


CC BY-SA 4.0
2019-03-28T08:14:23.860
53784
2019-03-28T12:06:43.060
9008
question
swift
インスタンス変数初期化の `={}()` の記法は JavaScriptでいうところの無名関数の即時実行ですか？


**_これはJavaScriptでいうところの無名関数の即時実行と同じと考えてよいのでしょうか？_**

はい、その通りです。

**_この記法が載っておらず、どういった文法なのかわからずにいます。_**

示されたリンク先はPropertiesであるのに対して、「この記法」はPropertiesの初期化以外にも使える一般的な式ですから、その場所には載っていません。

あえて言うと、

[Functions](https://docs.swift.org/swift-book/LanguageGuide/Functions.html)  
[Closures](https://docs.swift.org/swift-book/LanguageGuide/Closures.html)

辺りが該当するかと思うのですが、特に「この記法」について詳しく解説する部分はなく一般的な説明が続くので理解しづらいかも知れません。

もう少し文法よりの記載でよければ、この辺りになります。

[closure-expression](https://docs.swift.org/swift-
book/ReferenceManual/Expressions.html#grammar_closure-expression)  
[function-call-expression](https://docs.swift.org/swift-
book/ReferenceManual/Expressions.html#grammar_function-call-expression)

あなたの式の中で`{ 〜 }`の部分がクロージャ式(Closure Expression)であり、その後ろに`()`をくっつけた`{ 〜
}()`が関数呼出式(Function Call Expression)だと言うことになります。

クロージャ式と言うと、引数を持つ`{ 〜 in 〜 }`という形が一般的ですが、引数がないクロージャであるため、`〜
in`が省略されたものです。引数なしの関数を呼び出すときには`関数名()`のように、関数名の後ろに`()`を付けますよね?
同じように、引数なしのクロージャを呼び出すときには`引数なしのクロージャ()`のように、クロージャの後ろに`()`を付けるのです。

* * *

最初の方で述べたように、この記法は普通の式ですから、(読みやすいかどうかとか効率は今は置いておくと)こんな風に書いたって構いません。

[code]

    var n = 100
    while ({
        var sum = 0
        for i in 1...n {
            sum += i
        }
        return sum
    
    }() > 100) {
        n -= 1
    }
    print(n) //->13 (1...Nの合計が100未満になる最大のN)
    
[/code]

「出来るかどうか」と「やった方が良いかどうか」は全くの別問題だという例になっているような気もしますが、`{ 〜
}()`が単に式であるというのはわかっていただけるかと思います。


CC BY-SA 4.0
2019-03-28T12:06:43.060
53786
2019-03-28T12:06:43.060
13972
53784
answer