22441

[code]

    typedef struct {
        int test;
    }TESTARRAYSTRUCT;
    typedef struct {
        int test;
        TESTARRAYSTRUCT testarray[10];
    }TESTSTRUCT;
    
[/code]

このような構造体の定義されたC＋＋ヘッダをブリッジファイルで  
インポートすることで、swiftからの参照が可能でした。

swift側で以下のように使用できましたが、

[code]

    var test = TESTSTRUCT()
    test.test = 1
    
[/code]

以下は使用できませんでした。

[code]

    test.testarray[0].test
    
[/code]

なぜか、下記のような方法は使用できました…。

[code]

    test.testarray.0.test = 1
    
[/code]

ただ、このような場合、配列番号を添え字(test.testarray.i.test = 1）にしたくても  
できないようなのですが、（そもそも、なぜ、パス内に数値があるのかよくわからない）  
swift側の配列とC++側の配列では互換がとれないのでしょうか。


CC BY-SA 3.0
2016-02-23T10:31:43.710
22431
2016-02-23T13:24:43.323
12842
question
swift
c++ソースの構造体(配列)を使用したい


(Swiftでは、C++との協調動作は考慮されておらず、質問に御記載のstructがSwiftに移入できたのは、C言語と互換の部分だけを使っているからです。C++特有のデータ型や機能を含む場合はそもそもSwift側から見ることもできません。タイトルと質問内の「++」はできれば省かれた方が良いと思います。)

で、結論から。  
_swift側の配列とC++側の配列では互換がとれないのでしょうか。_  
とれません。SwiftにはCの配列に対応するような言語上のデータ構造は存在しません。SwiftのArray型は、内部的にはCの配列というよりも、はるかにJavaのArrayList型やC#のList型に近いものです。(という言い方では違いのわからない人、すいません。)

Swiftのコードを編集している状態で、Xcodeエディターの上で`TESTSTRUCT`をCmd-
Clickし、内容を確認すればわかるのですが、`TESTSTRUCT`型はSwiftに次のように移入されています。  
(場合によっては開いた内容がC/Objective-C版の表示の時があるので、さらにエディター領域左上の4□アイコンをクリックして"Generated
Header"を選ぶとSwift版の表示になります。ちなみにXcodeのバージョンにより細かい挙動が変わるのですが、最新リリース版の7.2.1だと同じ内容が2回繰り返されて表示されることがあるみたいです。)

[code]

    public struct TESTSTRUCT {
        public var test: Int32
        public var testarray: (TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT)
        public init()
        public init(test: Int32, testarray: (TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT, TESTARRAYSTRUCT))
    }
    
[/code]

まだ要素数が10なので、全文載せようかという気になるのですが、標準Cライブラリにある構造体の場合、要素数が256だの512だののchar配列を内部に持つ構造体もあり、それらのSwiftに移入された姿はなかなかおぞましいものになります。  
というわけで、「そもそも、なぜ、パス内に数値があるのかよくわからない」ですが、見て頂いたようにCの配列がSwiftのtupleとして移入されたから、ということになります。

Swiftで配列を内部に持つC言語の構造体を移入すると、このようにtupleを持つstructという形になります。tuple部分を配列的にアクセスしようと思うと、先頭要素のポインタ経由でアクセスするしかないようです。

[code]

        var test = TESTSTRUCT()
        withUnsafeMutablePointer(&test.testarray.0) {testarrayPtr in
            testarrayPtr[0].test = 1234
        }
        print(test.testarray.0.test) //->1234
    
[/code]

SwiftのC言語との協調動作については、バージョンアップのたびに改善されてはきているのですが、この辺りはまだ多くの方が不満に思うところのようです。


CC BY-SA 3.0
2016-02-23T13:24:43.323
22441
2016-02-23T13:24:43.323
13972
22431
answer