从SWIFT中的一系列字符初始化字符串 [英] Initialize a String from a range of Characters in Swift

查看:49
本文介绍了从SWIFT中的一系列字符初始化字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我们的代码中,我们发现了一个由于没有正确书写字母表而导致的错误。不是"0123456789abcdefghijklmnopqrstuvwxyz",而是"0123456789abcdefghijklmnoqprstuvwxyz"。所以我们想知道是否有可能通过声明由字符范围组成的字符串来避免类似的打字错误?

使用SWIFT 4.1+,我们尝试:

尝试%1

let 📚1: String = "0"..."9" + "a"..."z"

相邻运算符在非关联优先级组"RangeFormationPrecedence"中

尝试%2

let 📚2: String = ("0"..."9") + ("a"..."z")

二元运算符"+"不能应用于两个"ClosedRange<String>"操作数

尝试%3

let 📚3: String = String("0"..."9") + String("a"..."z")

无法使用类型为"(ClosedRange<String>)"的参数列表调用类型为"string"的初始值设定项

尝试%4

let 📚4: String = (Character("0")...Character("9")) + (Character("a")...Character("z"))

二元运算符"+"不能应用于两个"ClosedRange<Character>"操作数

尝试5

let 📚5: String = String(Character("0")...Character("9")) + String(Character("a")...Character("z"))

无法使用类型为"(ClosedRange<Character>)"的参数列表调用类型为"string"的初始值设定项

推荐答案

"a"..."z"ClosedRange,但不是CountableClosedRange。 它表示s为其"a" <= s <= "z"的所有字符串 根据Unicode标准。这不仅仅是英文字母表中的26个小写字母,还有更多的字母,如"ä"、"è"、"ô"。 (另请比较 ClosedInterval<String> to [String] in Swift。)

特别是"a"..."z"不是Sequence,这就是为什么 String("a"..."z")不起作用。

您可以做的是创建Unicode标量值范围 它们是(UInt32)数字(使用UInt32(_ v: Unicode.Scalar)初始值设定项):

let letters = UInt32("a") ... UInt32("z")
let digits = UInt32("0") ... UInt32("9")
然后创建一个包含其中所有Unicode标量值的字符串 (可数!)范围:

let string = String(String.UnicodeScalarView(letters.compactMap(UnicodeScalar.init)))
    + String(String.UnicodeScalarView(digits.compactMap(UnicodeScalar.init)))

print(string) // abcdefghijklmnopqrstuvwxyz0123456789

(对于4.1之前的SWIFT,将compactMap替换为flatMap。)

这也适用于非ASCII字符。示例:

let greekLetters = UInt32("α") ... UInt32("ω")
let greekAlphabet = String(String.UnicodeScalarView(greekLetters.compactMap(UnicodeScalar.init)))
print(greekAlphabet) // αβγδεζηθικλμνξοπρςστυφχψω

这篇关于从SWIFT中的一系列字符初始化字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆