11851


コード:

[code]

    class Hoge {
        var a: Int = 0
        var b: Int = 0
    
        init(a: Int, b: Int) {
            self.a = a
            self.b = b
        }
    
        func tasi() {
            println(a + b)
        }
    }
    
    var hoge: Hoge = Hoge(a: 10, b: 20)
    
    hoge.tasi()
    
    extension Hoge {
        func kake() {
            println(a * b)
        }
    }
    
    hoge.kake()
    
[/code]

結果:

[code]

    30
    200
    
[/code]

上記コードでextension Hogeのあと、再度インスタンス化する必要があると思うのですが、hoge.kake()が実行できてしまいます。

実行環境が、<http://www.runswiftlang.com/> なので、バグかなと思っているのですが、これはswiftの正しい動きなのでしょうか？

よろしくお願いします。


CC BY-SA 3.0
2015-06-29T07:40:49.813
11849
2015-06-30T11:50:48.760
question
swift
extensionについて


正しい動作です。

>
> extensionを定義して既存の型に新しい機能を追加した場合、その新しい機能はextensionを定義する前に作られていたものを含むすべてのインスタンスにおいて有効になります。

<https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html#//apple_ref/doc/uid/TP40014097-CH24-ID470>

> If you define an extension to add new functionality to an existing  
>  type, the new functionality will be available on all existing  
>  instances of that type, even if they were created before the extension  
>  was defined.


CC BY-SA 3.0
2015-06-29T08:21:46.070
11851
2015-06-29T08:21:46.070
3639
11849
answer


正しい動きなようです。  
Xcode 6.3.2のPlaygroundで実行した結果：

![画像の説明をここに入力](https://i.stack.imgur.com/eahwR.png)

出力位置がわかりにくい場所にあるので、見落とさないでください。

Xcode 6.3.2のCommand Line Toolで実行した結果：

![画像の説明をここに入力](https://i.stack.imgur.com/RyBom.png)

私は、おかしな挙動だという印象を持ちません。むしろ、コンパイラが賢くなったという好意的な印象を持ちます。


CC BY-SA 3.0
2015-06-29T08:24:40.060
11852
2015-06-30T11:50:48.760
2015-06-30T11:50:48.760
7362
7362
11849
answer