matchesInString()メソッドがString最初の引数としてa を取る場合でも、は内部的にで動作しNSString、範囲パラメーターはNSString、Swift文字列の長さではなく、長さを使用して指定する必要があります。そうしないと、「フラグ」などの「拡張書記素クラスタ」では失敗します。
以下のようスイフト4(Xcodeの9)、スウィフト標準ライブラリとの間で変換する機能を提供Range<String.Index> 
し、NSRange。
func matches(for regex: String, in text: String) -> [String] {
    do {
        let regex = try NSRegularExpression(pattern: regex)
        let results = regex.matches(in: text,
                                    range: NSRange(text.startIndex..., in: text))
        return results.map {
            String(text[Range($0.range, in: text)!])
        }
    } catch let error {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}
例:
let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]
注:は指定されたstringのサブストリングを参照するRange($0.range, in: text)!ため、強制アンラップは安全です。ただし、それを避けたい場合は、NSRangetext
        return results.flatMap {
            Range($0.range, in: text).map { String(text[$0]) }
        }
代わりに。
(Swift 3以前の古い回答:)
したがって、指定されたSwift文字列をに変換してからNSString、範囲を抽出する必要があります。結果は自動的にSwift文字列配列に変換されます。
(Swift 1.2のコードは編集履歴にあります。)
Swift 2(Xcode 7.3.1):
func matchesForRegexInText(regex: String, text: String) -> [String] {
    do {
        let regex = try NSRegularExpression(pattern: regex, options: [])
        let nsString = text as NSString
        let results = regex.matchesInString(text,
                                            options: [], range: NSMakeRange(0, nsString.length))
        return results.map { nsString.substringWithRange($0.range)}
    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}
例:
let string = "🇩🇪€4€9"
let matches = matchesForRegexInText("[0-9]", text: string)
print(matches)
// ["4", "9"]
Swift 3(Xcode 8)
func matches(for regex: String, in text: String) -> [String] {
    do {
        let regex = try NSRegularExpression(pattern: regex)
        let nsString = text as NSString
        let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
        return results.map { nsString.substring(with: $0.range)}
    } catch let error {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}
例:
let string = "🇩🇪€4€9"
let matched = matches(for: "[0-9]", in: string)
print(matched)
// ["4", "9"]