23138

[code]

    private var test1: Int = 0
    private var test2: Int = 0
    private var test3: Int = 0
    
    private var testArray: [Int] {
        get {
           return [test1, test2, test3]
        }
    }
    
[/code]

上記とすることで配列定義できることを教えていただいたのですが、  
ポインターの配列とすることはできないのでしょうか。  
下記のようではだめでした。

[code]

    private var testArray: [UnsafePointer<Int>] {
        get {
           return [&test1, &test2, &test3]
        }
    }
    
[/code]


CC BY-SA 3.0
2016-03-14T13:32:44.910
23129
2016-03-15T13:07:13.840
2016-03-15T00:56:22.227
4129
12842
question
swift
ポインタの配列を利用したい


Swiftでは`&`記号は"address
of"演算子ではなく、単にinoutパラメータであることを明示する(それによって関数呼び出しで値が変更される可能性があることをプログラマーに意識させるという効果があります)だけのもので、関数(メソッド含む)呼び出し以外では、ポインターを取得することはできません。

関数呼び出しなら良いんでしょということでこんな関数を使うことができるんですが、

[code]

        private var testArray: [UnsafePointer<Int>] {
            get {
                return withUnsafePointers(&test1, &test2, &test3) {
                    test1Ptr, test2Ptr, test3Ptr in
                    return [test1Ptr, test2Ptr, test3Ptr]
                }
            }
        }
    
[/code]

基本的にwith...Pointer系の関数やメソッドではクロージャーにポインターとして渡される値はそのクロージャーを実行している間しか有効性が保障されないと考えるべきで、上記と全く同じコードが、`test1`,
`test2`,
`test3`の宣言された場所によっては全く期待通りに動かないこともあります。超要注意の記法で、どうしてもポインターでなければいけないという場合以外には使わないようにしてください。  
(とは言ってもCやObjective-
CのAPIを使おうと思うと「どうしてもポインター」と言う場合にはちょくちょく遭遇するんですが。とにかく「単にポインターを取り出すイディオム」的な軽い気持ちでは`with...Pointer`を使わないようにしてください。)

(追記)  
コメントにあるaddObserverでのcontext引数の指定の仕方、最近のAppleのサンプルコードによく見られる形はこんなものです。(既にご存知かも知れませんが。)  
グローバル変数として:

[code]

    private var nantokaContext = 0 //当然Intになる
    //...addObjserverに必要な数だけ繰り返し
    
[/code]

同じファイルのとあるクラスのとあるメソッドの中:

[code]

            anObject.addObserver(self, forKeyPath: nantokaKey, options: [], context: &nantokaContext)
            //その他いろいろのaddObserverも同様
    
[/code]

数が多くなるとこの部分をループにして、と思われるのも無理はありませんが、Appleのサンプルコードにはそんな例を見たことはありません。addObserverでのcontextの指定の仕方については、また興味と必要に応じて別件としてお尋ねください。


CC BY-SA 3.0
2016-03-14T23:02:22.423
23138
2016-03-15T13:07:13.840
2016-03-15T13:07:13.840
13972
13972
23129
answer