0

Previously, when you wanted to see if your Swift string contained another string, you would cast it to a NSString and call .containsString. Apple, in their infinite wisdom, made this version-aware, so if you try it under S2 it will demand a #available wrapper even if your target platform does support it (which I guess is a bug).

Maury Markowitz
  • 9,082
  • 11
  • 46
  • 98
  • 1
    Why don't you just use `rangeOfString()` without any bridging to `NSString`? That works with all current Swift versions. – Martin R Jun 18 '15 at 16:35

1 Answers1

1

So the best solution appears to be this:

extension String {
    func contains(substr: String) -> Bool {
        if #available(OSX 10.10, *) {
            return NSString(string: self).containsString(substr)
        } else {
            return self.rangeOfString(substr) != nil
        }
    }
}

and now to check it, instead of this:

if NSString(string: line).containsString(" ")...

you get to use the much nicer looking:

if line.contains(" ")...

This no longer complains about the version, and (IMHO) looks better too. You almost certainly want this too:

extension String {
    var length: Int {
        return self.characters.count
    }
}

Apple keeps changing the way you get length, and I hope that any future changes to the API will be #available-able, at which point .length can be easily modified. And these are just for sanity:

extension String {
    subscript (r: Range<Int>) -> String {
        get {
            let subStart = advance(self.startIndex, r.startIndex, self.endIndex)
            let subEnd = advance(subStart, r.endIndex - r.startIndex, self.endIndex)
            return self.substringWithRange(Range(start: subStart, end: subEnd))
        }
    }
    func substring(from: Int) -> String {
        let end = self.characters.count
        return self[from..<end]
    }
    func substring(from: Int, length: Int) -> String {
        let end = from + length
        return self[from..<end]
    }
}

extension String {
    func trim() -> String {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    }
    func trim(withSet: NSCharacterSet) -> String {
        return self.stringByTrimmingCharactersInSet(withSet)
    }
}
Maury Markowitz
  • 9,082
  • 11
  • 46
  • 98
  • Various integer-based subscripting methods have also been posted in the answers to http://stackoverflow.com/questions/24092884/get-nth-character-of-a-string-in-swift-programming-language. – Martin R Jun 18 '15 at 16:43