使用IBM Swift Sandbox和rangeOfCharacterFromSet

时间:2015-12-13 19:45:53

标签: swift nsstring ibm-swift-sandbox

我正在尝试使用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($0).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($0).rangeOfCharacterFromSet(letters) != nil})

我忘了导入一些东西吗?希望你能帮帮我。

感谢。

3 个答案:

答案 0 :(得分:0)

rangeOfCharacterFromSet是众多String方法中的一种 实际上由NSString处理。

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

答案 1 :(得分:0)

答案 2 :(得分:0)

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

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

  • 数组:.reverse().reversed()
  • 字符串:.rangeOfCharacterFromSet().rangeOfCharacter(from:)
  • (NS)CharacterSet:.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($0)
    }.map { Character($0) }
    let reverseLetters = onlyLetters.reversed()
    print("\(String(onlyLetters)) == \(String(reverseLetters))")
    return String(onlyLetters) == String(reverseLetters)
}

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

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