Swift3 中的 UUID,但 "version 1" 样式 UUID
UUID in Swift3, but "version 1" style UUID
这个问题是关于Swift.
在 Swift 中生成 rfc UUID 非常容易得到 Swift String
因为在这个阶段苹果已经制作了 Swift 方法...
func sfUUID()->String
{
return UUID().uuidString.lowercased()
}
我需要一个旧式 "version 1" UUID,当使用 Swift
Swift3有没有办法做到这一点? (仅限 >9)
在Swift中,如何获取版本 1 UUID。因此,在 UUID()
调用中可能有一些我不知道的选项,或者很难调用 C 调用并安全地获得结果作为 String
.
Callam 的 link 才是真正的答案。 Swift 可以(并且在这种情况下必须)调用 C,因此您真正需要的就是 C 函数的名称。
但是这里的 "Swift" 问题只是如何从 Swift 调用 C 函数,这是一个比这个特定问题更重要的通用技能(并且在当前文档)。所以值得研究以下是如何工作的,而不是仅仅把它当作 "how do you generate a v1 UUID in Swift."
的答案
var uuid: uuid_t = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
withUnsafeMutablePointer(to: &uuid) {
[=10=].withMemoryRebound(to: UInt8.self, capacity: 16) {
uuid_generate_time([=10=])
}
}
let finalUUID = UUID(uuid: uuid)
这太过时了。不要再这样做了。
我会删除答案,但它被勾选了!
Swift 到达 C 调用的代码...
func generateVersionOneAkaTimeBasedUUID() -> String {
// figure out the sizes
let uuidSize = MemoryLayout<uuid_t>.size
let uuidStringSize = MemoryLayout<uuid_string_t>.size
// get some ram
let uuidPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: uuidSize)
let uuidStringPointer = UnsafeMutablePointer<Int8>.allocate(capacity: uuidStringSize)
// do the work in C
uuid_generate_time(uuidPointer)
uuid_unparse(uuidPointer, uuidStringPointer)
// make a Swift string while we still have the C stuff
let uuidString = NSString(utf8String: uuidStringPointer) as? String
// avoid leaks
uuidPointer.deallocate(capacity: uuidSize)
uuidStringPointer.deallocate(capacity: uuidStringSize)
assert(uuidString != nil, "uuid (V1 style) failed")
return uuidString ?? ""
}
这个问题是关于Swift.
在 Swift 中生成 rfc UUID 非常容易得到 Swift String
因为在这个阶段苹果已经制作了 Swift 方法...
func sfUUID()->String
{
return UUID().uuidString.lowercased()
}
我需要一个旧式 "version 1" UUID,当使用 Swift
Swift3有没有办法做到这一点? (仅限 >9)
在Swift中,如何获取版本 1 UUID。因此,在 UUID()
调用中可能有一些我不知道的选项,或者很难调用 C 调用并安全地获得结果作为 String
.
Callam 的 link 才是真正的答案。 Swift 可以(并且在这种情况下必须)调用 C,因此您真正需要的就是 C 函数的名称。
但是这里的 "Swift" 问题只是如何从 Swift 调用 C 函数,这是一个比这个特定问题更重要的通用技能(并且在当前文档)。所以值得研究以下是如何工作的,而不是仅仅把它当作 "how do you generate a v1 UUID in Swift."
的答案var uuid: uuid_t = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
withUnsafeMutablePointer(to: &uuid) {
[=10=].withMemoryRebound(to: UInt8.self, capacity: 16) {
uuid_generate_time([=10=])
}
}
let finalUUID = UUID(uuid: uuid)
这太过时了。不要再这样做了。
我会删除答案,但它被勾选了!
Swift 到达 C 调用的代码...
func generateVersionOneAkaTimeBasedUUID() -> String {
// figure out the sizes
let uuidSize = MemoryLayout<uuid_t>.size
let uuidStringSize = MemoryLayout<uuid_string_t>.size
// get some ram
let uuidPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: uuidSize)
let uuidStringPointer = UnsafeMutablePointer<Int8>.allocate(capacity: uuidStringSize)
// do the work in C
uuid_generate_time(uuidPointer)
uuid_unparse(uuidPointer, uuidStringPointer)
// make a Swift string while we still have the C stuff
let uuidString = NSString(utf8String: uuidStringPointer) as? String
// avoid leaks
uuidPointer.deallocate(capacity: uuidSize)
uuidStringPointer.deallocate(capacity: uuidStringSize)
assert(uuidString != nil, "uuid (V1 style) failed")
return uuidString ?? ""
}