string - 替换swift 3字符串中的字符

标签 string swift3

我需要一个函数来连续用字符 A..J 替换数字 0..9。 我如何在 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,其他一切都保留

实现

出于对大型字符串的性能原因,使用lazy 字符集合。一个不懒惰的人会创建一个中间 Array

一个字符到另一个字符的映射经过以下过程:

  1. 尝试将字符转换为Int(这里是Int?)

    1.1 如果失败(nil),nil 合并运算符(??)开始发挥作用并返回输入字符

  2. Int 值 ($0) 现在通过其(移位的)ASCII 表示 ASCII Table 转换回字符

  3. 将延迟映射的集合转换为 String。初始化程序的 Swifts 声明:

    public init<S : Sequence>(_ characters: S)
        where S.Iterator.Element == Character { ... }
    

关于string - 替换swift 3字符串中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39493102/

相关文章:

java - 如何通过更改其中的一个特定字段来创建新的 json 字符串?

linux - 提取 2 个子串之间的子串

string - 在不同 View 上显示输入文本

swift - 无法将类型 'String' 的值转换为预期的参数类型 'TimeInterval'(又名 'Double')

ios - 如何设置navigationItem.titleView图片水平居中?

ios - 如何使用Swift 3在核心数据中搜索字符串?

c# - 字符串比较 == 是否仅因为字符串不可变才起作用?

c# - 为什么字符串不比较引用?

swift - 如何允许在 Swift 中自定义类型和现有类型之间进行类型转换

swift - SigQuit 在 Swift 3、Xcode 8.2.1 中的含义