使用 IBM Swift 沙盒和 rangeOfCharacterFromSet

Using IBM Swift Sandbox and rangeOfCharacterFromSet

我正在尝试 swift IBM 的新 Swift 在线沙箱。 以下脚本不在该沙箱上 运行:http://swiftlang.ng.bluemix.net/

import Foundation


func palindromTest(s: String) -> Bool{
    let lower = s.lowercaseString
    let letters = NSCharacterSet.letterCharacterSet()
    let onlyLetters = lower.characters.filter({String([=11=]).rangeOfCharacterFromSet(letters) != nil})
    let reverseLetters = Array(onlyLetters).reverse()

    return String(onlyLetters) == String(reverseLetters)
}

palindromTest("abc")

沙箱打印以下错误消息:

/swift-execution/code-tmp.swift:7:48: error: value of type 'String' has no member 'rangeOfCharacterFromSet'
    let onlyLetters = lower.characters.filter({String([=12=]).rangeOfCharacterFromSet(letters) != nil})

我是不是忘记导入什么了?希望你能帮助我。

谢谢。

rangeOfCharacterFromSet 是众多 String 方法之一 实际上由 NSString.

处理

来自this commit 到 NSString.swift,似乎支持 rangeOfCharacterFromSet 最近才添加到(非 Apple)基金会图书馆, 所以在 IBM Swift Sandbox 更新为可以使用之前您不能使用它 一个新的 Swift 版本。

FWIW,现在可以在沙盒中使用 swiftlang.ng.bluemix.net/#/repl/aae5d1caf4e0a6232ff428c3a0160e6e98cba6ed913ce9176f2baee46d30cb1c

自给出这些答案以来,很多事情都发生了变化。 I've updated Pat's Sandbox answer for Swift 3.1.1。以下是 API 更改的代码和摘要。

标准库和 Foundation 中的几个方法已经重命名:

  • 数组:.reverse().reversed()
  • 字符串:.rangeOfCharacterFromSet().rangeOfCharacter(from:)
  • (NS)字符集:.lettersCharacterSet().letters

我也做了一点改动,可能是个人喜好吧。我没有使用 String.rangeOfCharacter(from:),而是选择使用 CharacterSet.contains(),这要求我使用 String.unicodeScalars 而不是 .characters。不确定一般的性能权衡,但我喜欢清理的方式。

import Foundation

func palindromTest(_ word: String) -> Bool{
    let letters = CharacterSet.letters
    let onlyLetters = word.lowercased().unicodeScalars.filter { 
        letters.contains([=10=])
    }.map { Character([=10=]) }
    let reverseLetters = onlyLetters.reversed()
    print("\(String(onlyLetters)) == \(String(reverseLetters))")
    return String(onlyLetters) == String(reverseLetters)
}

print(palindromTest("abc")) 
// false

print(palindromTest("dud")) 
// true