在Swift中将字符添加到整数

4

在 Obj-C 中,我通过将介于 0 和 25 之间的随机值添加到字符 "A" 来生成随机数字:

'A' + arc4random() % 26

在Swift中,我发现唯一的方法是以下方式。
func +(left: Character, right: Int) -> Character {
    let oldCharUnicodeScalars = String(left).unicodeScalars

    let newCharIntRepresentation = 
           Int(oldCharUnicodeScalars[oldCharUnicodeScalars.startIndex].value) + right

    return Character("\(UnicodeScalar(newCharIntRepresentation))")
}

let rndChar = String(Character("A") + Int(arc4random()%26))

我在想是否有更简单、更灵活的解决方案。

1
你的最终目标是什么?你只是想要一个在A-Z之间随机的字符吗? - cmyr
@cmyr 我对您的可能解决方案很感兴趣,但我也希望能更好地实现所提出的问题。 - Teejay
依我之见,他想要一个更简单的解决方案来完成同样的任务(生成[A-Z]范围内的随机字符)。 - peterh
3个回答

4
您可以使用一些组合来创建与原始解决方案类似的一行代码(虽然我不认为这更灵活):
var rndChar = String(UnicodeScalar("A".utf16[0] + Int(arc4random_uniform(26))))
Stringutf16属性返回一个UTF16View,然后您可以使用Int(0)为索引获取第一个字符(在本例中是唯一的字符"A")的UInt16表示。 然后,将随机数添加到025之间,将其传递给UnicodeScalar的构造函数,并将该UnicodeScalar传递给String的构造函数...嗯。

如果您只想要一个介于"A""Z"之间的随机字符,另一种方法就是从包含所需字符的字符串创建一个数组,然后从该数组中获取一个随机项:

var rndChar = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ")[Int(arc4random_uniform(26))]

arc4random_uniform()将返回一个小于upper_bound的均匀分布的随机数。建议使用arc4random_uniform(26)而不是arc4random() % 26,因为它会给出更一致的随机数:

当上限不是2的幂时,建议使用arc4random_uniform()而不是arc4random() % upper_bound,因为它避免了"模偏差"。


谢谢,那个一行代码正是我想要的。我也不知道可以使用简单的整数索引(而不是UnicodeScalarIndex)来索引UTF16View。 - Teejay
是的,当我在浏览生成的头文件时发现UTF16View真是个好东西 :) - Mike S

1

对于今天的Swift而言,它并没有提供一种简单的方式来将String添加到Int中。

那么这种方法怎么样:

func getArrayfromAToZ() -> [String] {
    var charList = [String]()
    for char in 0x41...0x5A { //ascii from 'A' to 'Z'
        charList += [String(UnicodeScalar(char))]
    }
    return charList // ["A", "B", "C", "D", "E", "F", "G", "H", .... "Z"]
}

let a = getArrayfromAToZ()[Int(arc4random_uniform(26))] // 'T', ... , 'W' 

1
谢谢,也许比我的更好,但Mike S的一行代码更棒。顺便说一句,我投了你的答案。 - Teejay

0

我可以提供一个更不安全但外观更好的重写您自己的运算符重载方法:

func +(left: String, right: UInt32) -> Character {
    let oldCharUnicodeScalars = String(left).unicodeScalars

    let newCharIntRepresentation =
    Int(oldCharUnicodeScalars[oldCharUnicodeScalars.startIndex].value) + right

    return Character("\(UnicodeScalar(newCharIntRepresentation))")
}

"A" + arc4random()%26 运行良好

"AA" + arc4random()%26 这是发生意外情况的时候!


不确定区别在哪里,除了第一个参数是字符串之外(这并不是一个优点,因为正如你所指出的那样,它会导致意外的行为)。 - Teejay

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