2016-12-13 7 views
1

私は完全なSwift初心者ですが、私はBLE用のアプリを迅速に作成しています。私は、iOSアプリケーションを構築してBLEと通信する方法を理解するために見つけたオープンソースコードの作業に取り組んでいます。私はそれをSwift 3に変換すると、いくつかのエラーが発生しました。Swift 3 "Inoutとして不変のまま渡すことはできません"

コード:

func int8Value() -> Int8 { 
    var value: Int8 = 0 
    copyBytes(to: &UInt8(value), count: MemoryLayout<Int8>.size) 
    return value 
} 

エラー:

Cannot pass immutable value as inout argument: function call returns immutable value

私はこれに対する解決策をオンラインで見てきたし、次を発見した:

は、私は次のコード行を見てみ、これらを実装してみました:

if let data = characteristic.value { 
    var bytes = Array(repeating: 0 as UInt8,count:someData.count/MemoryLayout<UInt8>.size) 
    data.copyBytes(to: &bytes, count:data.count) 
} 

let data = "foo".data(using: .utf8)! 
let array = [UInt8](data) 
let array = data.withUnsafeBytes { 
    [UInt8](UnsafeBufferPointer(start: $0, count: data.count)) 
} 

を私は本当に以外のそれらの間の相関関係を理解し​​ていません共通変数はほとんどありません。誰かがCopyBytes関数の中で何が起こっているのか( "to"と "count"が何をしているのか)、エラーが何から来ているのか、私が見てきた例が、修正しようとしていますか?

+0

@Martin Rを、あなたは私がした後、他のは....月を頼まれたとき、重複するとして、私の質問をマークし、なぜ私は混乱していますか? – zmillard

+1

重複の時間的順序は関係ありません。ユーザーは、通常、「マスター」の質問として最良の回答を持つ質問を選択します。あなたの質問に重複としてマークされているためのペナルティはないので、これは心配するものではありません。 –

+0

Ooh大丈夫、ありがとう@CodyGray – zmillard

答えて

1

Int8からUInt8にタイプキャストの問題があり、その結果のアドレスがUInt8になっているようです。キャストの結果は不変の値であり、そのメモリ位置は関数の引数として渡せません。単純に変数を符号なし整数として初期化すれば、それはちょうど良いアドレスを渡す必要があります。

次のコードは動作するはずです:

func int8Value() -> Int8 { 
    var value: UInt8 = 0 
    copyBytes(to: &value, count: MemoryLayout<Int8>.size) 
    return Int8(value) 
} 
+0

'value 'が0 ... 127の範囲外にある場合、実行時に' Int8(value) 'がクラッシュすることに注意してください。 http://stackoverflow.com/a/41653097/1187415を比較してください。 –

関連する問題