如何在Swift 4中过滤字符串中的字符

fs_*_*gre 11 string swift

在下面的Swift 3代码中,我从字符串中提取所有数字,但我无法弄清楚如何在Swift 4中做同样的事情.

var myString = "ABC26FS464"

let myNumbers = String(myString.characters.filter { "01234567890".characters.contains($0)})

print(myNumbers) // outputs 26464
Run Code Online (Sandbox Code Playgroud)

如何从Swift 4中的字符串中提取所有数字?

85C*_*aro 27

Swift 4使它更简单一些.只需删除.characters并使用

let myNumbers = myString.filter { "0123456789".contains($0) }
Run Code Online (Sandbox Code Playgroud)

但要真正做到这一点,你可以使用decimalDigits字符集......

let digitSet = CharacterSet.decimalDigits
let myNumbers = String(myString.unicodeScalars.filter { digitSet.contains($0) })
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您的第二个选项不会返回字符串.它返回一个String UnicodeScalarView.您仍然需要从中初始化一个新的String对象.`让字符串=字符串(myString.unicodeScalars.filter {CharacterSet.decimalDigits.contains($ 0)})`.在你不需要这样做的第一个中你实际上做了哪些是多余的.`let myNumbers = myString.filter {"0123456789".contains($ 0)}` (6认同)
  • 好吧,除了不必声明和维护自己的字符集(与其他字符集更相关,尽管你有两个0),可以说争论字符集方法是可本地化的. (2认同)
  • 我想我复制和粘贴相当仓促。已编辑。 (2认同)
  • 请摆脱第二个零 (2认同)
  • 我认为发布正确的代码比复制原始代码更好。谢谢你的关注。 (2认同)

小智 5

最简单:

由于“Character”几乎具有所有最常用的带有“.isXY”计算属性的字符检查,因此您可以使用此模式,这似乎是进行字符串过滤的最方便、最快捷的方法。

/// Line by line explanation.
let str = "Stri1ng wi2th 3numb4ers".filter(\.isNumber) // "1234"
let int = Int(str)                                     // Optional<Int>(1234)
let unwrappedInt = int!                                // 1234

/// Solution.
extension String {

    /// Numbers in the string as Int.
    /// 
    /// If doesn't have any numbers, then 0.
    var numbers: Int {
        Int(filter(\.isNumber)) ?? 0
    }

    /// Numbers in the string as Int.
    ///
    /// If doesn't have any numbers, then nil.
    var optionalNumbers: Int? {
        Int(filter(\.isNumber))
    }
}
Run Code Online (Sandbox Code Playgroud)