在Swift中向int添加char

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

'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))

我想知道是否有更简单,更灵活的东西.

解决方法

您可以结合使用一些东西来创建类似于原始解决方案的单行程序(我不会真的称之为更灵活):

var rndChar = String(UnicodeScalar("A".utf16[0] + Int(arc4random_uniform(26))))

String的utf16属性返回一个UTF16View,然后您可以使用Int(0)进行索引以获取一个字符的UInt16表示形式(在本例中为唯一字符“A”).然后,将0到25之间的随机添加到它,将其传递给UnicodeScalar的构造函数,并将该UnicodeScalar传递给String构造函数…… whew.

另一种方法,如果你只是在寻找“A”和“Z”之间的随机字符,那就是从你想要的字符串中创建一个数组,然后从该数组中获取一个随机项:

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

旁注:我建议使用arc4random_uniform(26)而不是arc4random()%26,因为它会给出一个更一致的随机数:

arc4random_uniform() will return a uniformly distributed random number less than upper_bound. arc4random_uniform() is recommended over constructions like arc4random() % upper_bound as it avoids “modulo bias” when the upper bound is not a power of two.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...