2016-12-19 5 views
1

Этот вопрос есть о Swift.UUID в Swift3, но «версия 1» стиль UUID

Это очень легко генерировать Ки UUID в Swift получить Swift String, как на этом этапе компании Apple сделали Swift метода для него ...

func sfUUID()->String 
    { 
    return UUID().uuidString.lowercased() 
    } 

Мне нужна старый стиль «версия 1" UUID, при использовании Swift

(Пример: https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_.28date-time_and_MAC_address.29)

есть ли способ сделать это в Swift3? (Только> 9)

Swift, как получить версию 1 UUID. Таким образом, может возникнуть некоторая опция, о которой я не знаю о вызове UUID(), или существует сложность вызова вызова C и получения результата безопасно как String.

+2

См http://stackoverflow.com/questions/15501914/time-based-uuid-version-1-on -ios – Callam

+0

привет @Callam Я ценю ссылку, это вопрос Swift – Fattie

+1

метод по-прежнему доступен в Swift – Callam

ответ

2

Вот код 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 ?? "" 
} 

Пример выводит

e8d1eb6e-c65f-11e6-bb89-a0999b112ea2 
e8d1ed1c-c65f-11e6-bb89-a0999b112ea2 
e8d1ed4e-c65f-11e6-bb89-a0999b112ea2 

другое физическое устройство

c83fdf22-c660-11e6-aca6-11ad80a9c011 
c83fe6e8-c660-11e6-aca6-11ad80a9c011 
c83fe904-c660-11e6-aca6-11ad80a9c011 
4

Callam's link - это реальный ответ. Swift может (и в этом случае должен) вызвать C, поэтому имя функции C - это все, что вам действительно нужно.

Но вопрос «Быстро» здесь заключается в том, как вызвать функцию С из Swift, что является общим навыком, который более важен, чем этот конкретный вопрос (и в настоящей документации он не очень хорошо объясняется). Поэтому стоит изучить, как работает следующее, и не воспринимать его как просто ответ на вопрос «как вы создаете UIID v1 в Swift».

var uuid: uuid_t = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) 
withUnsafeMutablePointer(to: &uuid) { 
    $0.withMemoryRebound(to: UInt8.self, capacity: 16) { 
     uuid_generate_time($0) 
    } 
} 

let finalUUID = UUID(uuid: uuid) 
+0

неважно: do вы думаете, что подход «MemoryLayout» ниже выглядит нормально? – Fattie

+1

Кажется намного сложнее. Почему вся обработка строк вручную? Swift может сделать все это для вас легко и безопасно. Создайте 'UUID' из' uuid_t', и если вам нужна строковая версия, просто попросите ее 'uuidString'. Но я не вижу особых проблем. –

Смежные вопросы