繁体   English   中英

Swift 将“字符”转换为“Unicode.Scalar”

[英]Swift convert 'Character' to 'Unicode.Scalar'

我试图从 String 中过滤出非字母字符,但遇到了CharacterSet使用Unicode.Scalar和 String 由Character组成的问题。

Xcode 给出了错误:

无法将“String.Element”(又名“Character”)类型的值转换为指定类型“Unicode.Scalar”?

let name = "name"
let allowedCharacters = CharacterSet.alphanumerics
let filteredName = name.filter { (c) -> Bool in
    if let s: Unicode.Scalar = c { // cannot convert
        return !allowedCharacters.contains(s)
    }
    return true
}

CharacterSet有一个不幸的名字,它继承自 Objective C。实际上,它是一组Unicode.Scalar ,而不是Characters (Unicode 术语中的“扩展Characters簇”)。 这是必要的,因为虽然有一组有限的 Unicode 标量,但有无限数量的可能的字素簇。 例如, e + ◌̄ + ◌̄ + ◌̄ ... ad e + ◌̄ + ◌̄ + ◌̄ ...仍然只是一个簇。 因此,不可能详尽地列出所有可能的集群,并且通常不可能列出具有特定属性的它们的子集。 问题中的集合操作必须改用标量(或至少使用从组件标量派生的定义)。

在 Swift 中, String有一个unicodeScalars属性,用于在标量级别对字符串进行操作,并且该属性是直接可变的。 这使您可以执行以下操作:

// Assuming...
var name: String = "..."

// ...then...
name.unicodeScalars.removeAll(where: { !CharacterSet.alphanumerics.contains($0) })

一个Character可以包含多个UnicodeScalar ,因此您需要遍历所有UnicodeScalar ,并检查它们是否包含在CharacterSet.alphanumerics

let allowedCharacters = CharacterSet.alphanumerics
let filteredName = name.filter { (c) -> Bool in
    return !c.unicodeScalars.contains(where: { !allowedCharacters.contains($0)})
}

测试输入: let name = "asd😊1"

测试输出: "asd1"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM