2015-12-13 20 views
0

我正在試試IBM新的Swift在線沙盒上的swift。 下面的腳本是不是對沙箱中運行:http://swiftlang.ng.bluemix.net/使用IBM Swift Sandbox和rangeOfCharacterFromSet

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}) 

難道我忘了進口的東西嗎?希望您能夠幫助我。

謝謝。

回答

0

rangeOfCharacterFromSet是實際由NSString處理的許多String方法 之一。

this commit 到NSString.swift,似乎是最近才加入到(非Apple)的基礎庫rangeOfCharacterFromSet 的支持, 所以你不能使用它,直到IBM斯威夫特沙箱更新爲使用 一個新的Swift版本。

0

很多事情已經改變,因爲這些答案中給出。 I've updated Pat's Sandbox answer for Swift 3.1.1。以下是API變更的代碼和摘要。

標準庫和基金會的幾種方法已經被重新命名:

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

我也做了一個小小的改變,也許只是從p個人偏好。我選擇使用CharacterSet.contains(),而不是使用String.rangeOfCharacter(from:),這需要我使用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