gpt4 book ai didi

swift - 从范围中获取索引值

转载 作者:IT王子 更新时间:2023-10-29 05:41:52 25 4
gpt4 key购买 nike

我想检索范围内的随机表情符号。

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: Cannot subscript a value of type 'FlattenBidirectionalCollection<[Range]>' (aka 'FlattenBidirectionalCollection>>') with an index of type 'UInt32'

获得结果的正确方法是什么?

最佳答案

问题是 flatten() 被延迟应用,因此返回一个特殊的 FlattenBidirectionalCollection ,由 FlattenBidirectionalCollectionIndex 索引,而不是 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]))

如果您希望延迟应用展平,您可以通过使用 advancedBy(_:) 直接(对于 Swift 2)下标 FlattenBidirectionalCollection关于收藏的 startIndex :

let randomIndex = flattenEmoji.startIndex.advancedBy(Int(arc4random_uniform(UInt32(flattenEmoji.count))))
let randomSign = String(UnicodeScalar(flattenEmoji[randomIndex]))

在 Swift 3 中,作为 collections move their indices , 你想使用集合的 index(_:offsetBy:)方法代替:

let randomIndex = flattenEmoji.index(flattenEmoji.startIndex, offsetBy: Int(arc4random_uniform(UInt32(flattenEmoji.count))))

关于swift - 从范围中获取索引值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39249764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com