2016-11-14 4 views
0

私はこのコードを既存のswiftで動作させています。ソリューションセットでもSwiftをアップデートした後でwithMemoryReboundを使用できません

func toByteArray<T>(_ value: T) -> [UInt8] { 
    var val = value 
    //let sock = socket(PF_INET, SOCK_STREAM, 0) // added in 11/16 
    return withUnsafePointer(to: &val) { 
     Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>($0), count: MemoryLayout<T>.size)) 
    } 
} 

initが使用できないというエラーメッセージが表示されるため、これは機能しません。 withMemoryRebound(to:capacity:_)を使用します。 [OK]を、私はグーグルを通じて研究し、働く必要のあるいくつかのオプションを発見した、今私の更新されたコードが

func toByteArray<T>(_ value: T) -> [UInt8] { 
    var val = value 
    return withUnsafePointer(to: &val) { 
     //another swift 3 change with UnsafePointer<UInt8> 
     Array(UnsafeBufferPointer(start: ($0).withMemoryRebound(to:UInt8.self, capacity: 1){ SCNetworkReachabilityCreateWithAddress(nil, $0)}, count: MemoryLayout<T>.size)) 
    } 

} 
動作するはず

であり、しかし、それは私が理解していない未解決の識別子SCNetworkReachabilityCreateWithAddressの使用が可能と言いますそれに対する解決策を見いだすことはできません。問題の内容は何ですか?更新されたSwiftとXcodeがあると私は感じています。

+0

コードの一つ不可解な長いラインである男、笑 – Alexander

+0

これは、あなたが探しているものかもしれません:http://stackoverflow.com/a/39004383/1187415。 –

答えて

0

はこれを試してみてください。UInt8の配列を作ることは、あなたの実際の目的のために最善の解決策になる場合

func toByteArray<T>(_ value: T) -> Any { 
    var value = value 

    let pointerToT = withUnsafePointer(to: &value) { UnsafeRawPointer($0) } 
    let sizeOfT = MemoryLayout<T>.size 

    let pointerToBytes = pointerToT.bindMemory(to: UInt8.self, capacity: sizeOfT) 
    let bytes = Array(UnsafeBufferPointer(start: bytePointer, count: sizeOfT)) 

    return bytes 
} 
2

のだろうか。例えば

、スウィフト3のUInt8のコレクションとしてData作品

func toData<T>(_ value: T) -> Data { 
    var val = value 
    return Data(bytes: &val, count: MemoryLayout<T>.size) 
} 
for byte in toData(i) { 
    print(String(format: "%02X", byte)) 
} 
/* output: 
78 
56 
34 
12 
00 
00 
00 
00 
*/ 

しかし、あなたは配列を使う、という場合は、スウィフト3.0.1/Xcodeのため、利用可能UnsafeRawBufferPointerを使用して、このようなものを(書くことができます8.1):

func toByteArray<T>(_ value: T) -> [UInt8] { 
    var val = value 
    return Array(UnsafeRawBufferPointer(start: &val, count: MemoryLayout<T>.size)) 
} 
+0

'Data'を使う方が適切です。 upvoteを持ってください – Alexander

+0

配列で試してみましたが、まだ解決されていない識別子の使用が記載されています。私はその声明にいくつかの簡単な解決策があると確信しています?なぜ私はそれを得るのか分からない。 – timedwalnut

+0

まだ解決されていない識別子の使用を示しています_どの識別子に?ビルド番号でXcodeのバージョンを表示してください。私のコードは実際にXcode 8.1(8B62)でテストされています。 – OOPer