String 替换swift 3字符串中的字符

String 替换swift 3字符串中的字符,string,swift3,String,Swift3,我需要一个函数将数字0..9连续替换为字符a..J。 我怎么能用Swift 3写呢? Swift 3字符串操作非常奇怪:| 我尝试访问字符,然后添加和偏移(移位)字符,但没有成功。以下是解决您的问题的可能方法,也是Unicode安全的: let string = "0123456789 abc xyz 9876543210" // upper case A...J use 65; lower case a...j use 97 let shift = 65 let convertedString

我需要一个函数将数字0..9连续替换为字符a..J。 我怎么能用Swift 3写呢? Swift 3字符串操作非常奇怪:|
我尝试访问字符,然后添加和偏移(移位)字符,但没有成功。

以下是解决您的问题的可能方法,也是Unicode安全的:

let string = "0123456789 abc xyz 9876543210"
// upper case A...J use 65; lower case a...j use 97
let shift = 65
let convertedString = String(string.characters.lazy.map{ char in
    Int(String(char)).map{ Character(UnicodeScalar($0 + shift)!) } ?? char
})
解释 想法/问题 将字符串的每个字符映射到另一个(或同一个)字符:0…9->A…J,其他所有字符保持不变

实施 对于大字符串,出于性能原因,请使用
惰性
字符集合。非惰性数组将创建一个中间
数组

从一个字符到另一个字符的映射过程如下:

  • 尝试将字符转换为
    Int
    (此处
    Int?

    1.1如果失败(为
    nil
    ),则nil合并运算符(
    ??
    )将进入播放,并返回输入字符

  • Int值(
    $0
    )现在通过其(移位的)ASCII表示形式转换回字符

  • 将延迟映射的集合转换为
    字符串
    。草签人的Swifts声明:

    public init<S : Sequence>(_ characters: S)
        where S.Iterator.Element == Character { ... }
    
    public init(uu个字符:S)
    其中S.Iterator.Element==字符{…}
    

  • 看看你尝试了什么会很有帮助的你为什么用
    lazy
    映射它?这样做的好处是什么?@NoahWilder简言之:如果我们不使用
    lazy
    ,我们将创建一个中间字符数组,如果字符串一开始很长,则需要大量内存。有关完整说明,请参见上面的“实施”部分。