我想在范围内检索随机表情符号。
let emojiRanges = [
0x1F601...0x1F64F,
0x1F680...0x1F6C0,
]
let flattenEmoji = emojiRanges.flatten()
// the loop for emoji works
for i in flattenEmoji {
let st = String(format:"0x%2X %@", i, String(UnicodeScalar(i)))
print(st)
}
// but this is not possible to obtain value at wanted index
//there is a compiler error:
let randomSign = String(UnicodeScalar(flattenEmoji[arc4random_uniform(UInt32(flattenEmoji.count))]))
print("RANDOM \(randomSign)")
错误:
ViewController.swift:68:67:无法使用索引类型为“ UInt32”的下标“ FlattenBidirectionalCollection <[Range]>”(又名“ FlattenBidirectionalCollection >>”)的值
获得结果的正确方法是什么?
问题是,它flatten()
是延迟应用的,因此会返回一个特殊值FlattenBidirectionalCollection
,该值由aFlattenBidirectionalCollectionIndex
而不是an索引Int
。
因此,最简单的解决方案是简单地使用Array(_:)
构造函数(或flatMap(_:)
),以热切地应用范围的展平,这将创建一个数组,然后可以使用下标Int
。
let flattenEmoji = Array(emojiRanges.flatten()) // In Swift 3, flatten() is named joined()
let randomIndex = Int(arc4random_uniform(UInt32(flattenEmoji.count)))
let randomSign = String(UnicodeScalar(flattenEmoji[randomIndex]))
如果您希望平缓地应用拼合,则可以FlattenBidirectionalCollection
通过advancedBy(_:)
在集合的上使用直接为(对于Swift 2)添加下标startIndex
:
let randomIndex = flattenEmoji.startIndex.advancedBy(Int(arc4random_uniform(UInt32(flattenEmoji.count))))
let randomSign = String(UnicodeScalar(flattenEmoji[randomIndex]))
在Swift 3中,当集合移动其索引时,您想使用集合的index(_:offsetBy:)
方法:
let randomIndex = flattenEmoji.index(flattenEmoji.startIndex, offsetBy: Int(arc4random_uniform(UInt32(flattenEmoji.count))))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句