0

I am trying swift on IBM's new Swift online Sandbox. The following script is not running on that sandbox: 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")

The sandbox prints the following error message:

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

Did I forget to import something? Hope you can help me.

Thanks.

TheSoundDefense
  • 6,753
  • 1
  • 30
  • 42
clex
  • 465
  • 2
  • 7
  • 19

3 Answers3

0

rangeOfCharacterFromSet is one of the many String methods which are actually handled by NSString.

From this commit to NSString.swift, it seems that support for rangeOfCharacterFromSet was added only recently to the (non-Apple) Foundation library, so you cannot use it until the IBM Swift Sandbox is updated to use a new Swift version.

Martin R
  • 529,903
  • 94
  • 1,240
  • 1,382
0

FWIW, this works now in the Sandbox swiftlang.ng.bluemix.net/#/repl/aae5d1caf4e0a6232ff428c3a0160e6e98cba6ed913ce9176f2baee46d30cb1c

Pat
  • 2,411
  • 2
  • 16
  • 11
0

Lots of things have changed since these answers were given. I've updated Pat's Sandbox answer for Swift 3.1.1. Below is the code and a summary of the API changes.

Several methods in the standard library and Foundation have since been renamed:

  • Array: .reverse().reversed()
  • String: .rangeOfCharacterFromSet().rangeOfCharacter(from:)
  • (NS)CharacterSet: .lettersCharacterSet().letters

I also made a slight change, perhaps just from personal preference. Rather than use String.rangeOfCharacter(from:) I chose to use CharacterSet.contains(), which required I use String.unicodeScalars instead of .characters. Not sure about the performance tradeoffs in general, but I liked how cleaned things up.

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
mklbtz
  • 773
  • 7
  • 17