在Swift语言中,在iOS上生成一个UUID。

335

在我的iOS Swift应用程序中,我想生成随机UUID(GUID)字符串以用作表键,并且这段代码似乎能够正常工作:

let uuid = CFUUIDCreateString(nil, CFUUIDCreate(nil))

这安全吗?

或者也许有更好的(推荐)方法吗?


6
你可以使用 let uuid = NSUUID.UUID().UUIDString。这行代码的作用是生成一个唯一的标识符。 - Yatheesha
请查看https://dev59.com/Km865IYBdhLWcg3whe9f。 - Yatheesha
1
请接受其中一个答案,而不是进行编辑。既然您正在按照@AhemdAlHafoudh的建议进行操作,我建议您接受他的答案。 - DarkDust
好的,明白了。谢谢...完成。 - zacjordaan
8个回答

693

试试这个:

let uuid = NSUUID().uuidString
print(uuid)

Swift 3/4/5

let uuid = UUID().uuidString
print(uuid)

7
在XCode 6.1中,我发现了这个错误: 'UUID()'不可用:使用对象构造'NSUUID()'。 我们应该将其更改为NSUUID()。UUIDString。 - ohyes
5
从Xcode 8(beta),iOS 10和Swift 3开始,这已被重命名为UUID().uuidString - califrench
1
嗨,我使用了UUID().uuidString方法,但似乎每次使用它都返回不同的字符串,我希望它只为我安装的应用程序提供一个值。有什么见解吗? - nerezza
@g212gs - 根据文档,情况并非如此:“只要应用程序(或同一供应商的另一个应用程序)安装在iOS设备上,此属性中的值将保持不变。当用户从设备中删除该供应商的所有应用程序并随后重新安装其中一个或多个应用程序时,该值会更改......因此,如果您的应用程序在任何地方存储此属性的值,则应优雅地处理标识符更改的情况。”- https://developer.apple.com/reference/uikit/uidevice/1620059-identifierforvendor - Zigglzworth
@Zigglzworth - 是的,现在我明白了确切的意思,感谢您的澄清 :) - g212gs
显示剩余4条评论

31
你也可以使用NSUUID API:
let uuid = NSUUID()

如果想要获取字符串值,可以使用uuid.UUIDString

请注意,NSUUID可在iOS 6及以上版本中使用。


24

对于Swift 4

let uuid = NSUUID().uuidString.lowercased()

7
这里有一个小问题,虽然不大明白为什么小写 UUID 比普通的 UUID 更好些。 - AlexK
3
因为它们应该是小写的,根据规范。UUID可以读取任何大小写,但应输出小写。iOS是唯一一个输出大写的平台。 - Brill Pappin
1
UUID是用数字0-9和字符a-f编写的十六进制数。大小写字母之间没有区别。然而,RCF 4122 https://tools.ietf.org/html/rfc4122#section-3要求UUID生成器以小写形式输出,但系统接受大小写字母的UUID。 - Daniel

17

对于 Swift 3,许多 Foundation 类型已经放弃了前缀 'NS',所以您可以通过 UUID().uuidString 访问它。


10

您也可以在以下情况下使用小写字母:can

let uuid = NSUUID().UUIDString.lowercaseString
print(uuid)

输出

68b696d7-320b-4402-a412-d9cee10fc6a3

谢谢!


1
谢谢。现在是 NSUUID().uuidString.lowercased() - Patrick Dura
5
使用小写字母有什么好处? - Luke Stanyer
也许小写字母比大写字母更加舒适? - tgunr
1
好处是它应该输出小写字母,因为所有其他平台都基于规范输出小写字母。苹果做错了。 - Brill Pappin
UUID是用数字0-9和字符a-f编写的十六进制数。大小写字母之间没有区别。然而,RCF 4122 https://tools.ietf.org/html/rfc4122#section-3要求UUID生成器以小写形式输出,但系统接受大小写字母的UUID。 - Daniel

9

每次都会生成相同的东西:

if let uuid = UIDevice.current.identifierForVendor?.uuidString {
    print(uuid)
}

每次都会生成一个新的:

let uuid = UUID().uuidString
print(uuid)

那么,我应该使用哪个来处理GADMobileAds? - steveSarsawa

3

UUID是一种简单的结构体,具有属性uuidString

uuidString - 返回从UUID创建的字符串,例如“E621E1F8-C36C-495A-93FC-0C247A3E6E5F”。

UUID保证唯一

Swift代码:

let identifier = UUID().uuidString
Swift.print(identifier) // Result: "6A967474-8672-4ABC-A57B-52EA809C5E6D"

苹果官方文档关于UUID


完整文章请查看https://tonidevblog.com/posts/how-to-generate-a-random-unique-identifier-with-uuid/

1
在 macOS 13 和 Swift 5.7 下,Foundation 的 UUID() 方法确实返回一个大写的 UUID,Vapor Fluent 至少是一个使用它的框架。因此,当您创建一个新记录并将 id 设为 nil 时,Fluent 将获取一个新的大写 UUID 并将其存储到新记录中。另一方面,MySQL 生成小写 UUID,并且如果您在 MySQL 中创建记录,则会存储小写 UUID。MySQL 和 SQLite 都将大写和小写键视为不同的键。买家自负。
但是... 如果您使用先前数据读取的 UUID,则保存它时是否使用了大写或小写 UUID 并不重要。您只需要确保不更改键的大小写即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接