Swift 3のアップデート後、UUID
オブジェクトではgetUUIDBytes
とgetBytes
の両方が使用できないように見えます。 https://developer.apple.com/reference/foundation/nsuuid/1411420-getbytesNSUUIDをUnsafePointerに変換する<UInt8>
答えて
一つの正しい方法:
let uuid = UIDevice.current.identifierForVendor!
var rawUuid = uuid.uuid
withUnsafePointer(to: &rawUuid) {rawUuidPtr in //<- `rawUuidPtr` is of type `UnsafePointer<uuid_t>`.
rawUuidPtr.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout<uuid_t>.size) {bytes in
//Use `bytes` only in this closure. (Do NEVER export `bytes` out of the closure.)
print(bytes[0],bytes[1])
//...
}
}
別の正しい方法:
withUnsafePointer(to: &rawUuid) {rawUuidPtr in //<- `rawUuidPtr` is of type `UnsafePointer<uuid_t>`.
let bytes = UnsafeRawPointer(rawUuidPtr).assumingMemoryBound(to: UInt8.self)
//Use `bytes` only in this closure. (Do NEVER export `bytes` out of the closure.)
print(bytes[0],bytes[1])
//...
}
let uuid = UIDevice.current.identifierForVendor
let mutableUUIDData = NSMutableData(length:16)
uuid.getBytes(UnsafeMutablePointer(mutableUUIDData!.mutableBytes))
// ^^^ compiler error, value of type UUID? has no member getBytes
は私がgetBytes
がドキュメントのUUIDのメソッドとしてリストされていても、このエラーが出ます
Robによって既にコメントされているように、クロージャの引数withUnsafeBytes
に渡されたポインタのエクスポートは完全に保証されていません。コンテキスト(32ビット/ 64ビット、x86/ARM、デバッグ/リリース、一見無関係なコードを追加...)の少しの変更は、あなたのアプリをクラッシャーにするでしょう。
uuidString
の
Data
と
NSUUID.getBytes
のバイト列が完全に異なっているということです:あなたはあまりにも複雑で考えている
let nsUuid = uuid as NSUUID //<-Using the same `UUID`
let mutableUUIDData = NSMutableData(length:16)!
nsUuid.getBytes(mutableUUIDData.mutableBytes.assumingMemoryBound(to: UInt8.self))
print(mutableUUIDData) //-><1682ed24 09224178 a279b44b 5a4944f4>
let uuidData = uuid.uuidString.data(using: .utf8)!
print(uuidData as NSData) //-><31363832 45443234 2d303932 322d3431 37382d41 3237392d 42343442 35413439 34344634>
:
func getUUID () -> Data {
let uuid = NSUUID()
var bytes = [UInt8](repeating: 0, count: 16)
uuid.getBytes(&bytes)
return Data(bytes: bytes)
}
はなぜその仕事?
は、あなたが持って考えてみましょう:
func printInt(atAddress p: UnsafeMutablePointer<Int>) {
print(p.pointee)
}
、あなたが実際にこれを行うことができます:
var value: Int = 23
printInt(atAddress: &value)
// Prints "23"
をしかし、あなたもこれを行うことができます。
var numbers = [5, 10, 15, 20]
printInt(atAddress: &numbers)
// Prints "5"
それは暗黙の「の形だがブリッジング "。 Swiftdoc.orgから引用すると:あなたは構文inoutの使用して配列を渡すとき
を配列の要素への変更可能なポインタが暗黙のうちに が作成されます。
この暗黙的なブリッジは、現在の関数が返るまで有効なポインタのみを保証します。このようなポインタは、現在の関数コンテキストを "エスケープ"してはいけませんが、inout引数は、呼び出された関数が返って呼び出される関数が現在の関数よりも前に返されるまで、これは間違っていることはできません。
そして、知らないもののために、NSUUID
にUUID
(... as NSUUID
)をキャストし、他の方法ラウンド(... as UUID
)は常に成功することが保証されています。しかし、あなたはUUID
を使う、という場合は、最も簡単な方法は次のとおりです。
private
func getUUID () -> Data {
var uuid = UUID().uuid
return withUnsafePointer(to: &uuid) {
return Data(bytes: $0, count: MemoryLayout.size(ofValue: uuid))
}
}
非常に簡単です。そしてそれは動作します! – davidgyoung
- 1. 'UnsafePointer <Double>'の値を 'UnsafePointer <_>'に変換できません
- 2. NSUUIDをNSDataに変換する方法
- 3. Swift - タイプ 'UnsafePointer <Any>'の値を予想される引数タイプ 'UnsafePointer <_>'に変換できません。
- 4. Swiftで文字列をNSUUIDに変換するには?
- 5. UnsafePointerに関する問題<DSPComplex> aurioTouchをSwiftに変換中3
- 6. が期待される引数の型「UnsafePointer <Void>」(別名「UnsafePointer <()>」)
- 7. UnsafePointer <[Float]>を変換する方法、またはフロート配列のデータをUnsafe [変更可能]に変換する方法Swift 3のポインタ<Float>?
- 8. UnsafePointer <CGAffineTransform> from CGAffineTransform
- 9. Swift 3:ヌルで終了するUnsafePointer <UInt8>を文字列に変換します。
- 10. Swift: 'Self'型の値を予想される引数型に変換できません 'UnsafePointer <Void>'
- 11. NSUUIDを比較するには
- 12. UnsafePointer <Int8>が動作しない
- 13. inout引数として不変の値を渡すことはできません: 'UnsafePointer <UInt8>'からの暗黙の変換? 「UnsafePointer <UInt8>?」にテンポラリを要求する
- 14. Swift 3 - UnsafePointer <CFDictionary>を使用していますか?
- 15. UnsafePointerとしてnilを渡す<UInt8>
- 16. CBUUIDとNSUUIDの相違点
- 17. 'UnsafePointer <Int8>'にはメンバー 'toString'がありません
- 18. Swift 3のUnsafePointer
- 19. リストの変換方法<Objects>をObservableRangeCollectionに変換する
- 20. 私はswfクラスをObject-cの__bridgeのようなUnsafePointerに変換するには
- 21. カスタムクラスをリストに変換する<>
- 22. <img/>をバナーに変換する
- 23. セット<Class<?>>をリストに変換するには?
- 24. リスト<String>をGroupMatcherに変換するには<JobKey>
- 25. 既存のCGRectからUnsafePointer <CGRect>を作成する方法
- 26. PHP XSLTをBRタグに変換する<br></br>
- 27. リストに<string>を変換する<string>()
- 28. Func <T, String>をFuncに変換する<T, bool>
- 29. Scala seq <string>をJavaリストに変換する<string>
- 30. 範囲<Int>を<Int>に変換する方法?
私は3 'Data'はその'私は順番にSHA1_Update' 'に渡す必要bytes'をvarsの持っている、そして、あなたの入力を取得したいのですが。推奨フローは本当に 'withUnsafeBytes'の3つのネストされたブロックを持っていますか? – ray
@rayは、Swift 3の 'Data'を使って作業しているときに正しい方法であると思われます。そうでない場合は' Unsafe [Mutable] Pointer'を使うことができます。誰か(Appleの開発フォーラムのAppleのスタッフ)は、C/Objective-CにもっとSwiftyラッパーを書くことを提案しています。 – OOPer