Swift:使用Obj-C类

Swift:使用Obj-C类,swift,Swift,我在操场上玩Swift,我创建了一个简单的代码,可以在123中翻译字符串,如onetwotree 开始时,我通过检查for循环中每个字符的大小写状态来实现它,然后我尝试使用正则表达式: let regExPattern = "(?<=(^|[a-z]))[A-Z][a-z]+(?=([A-Z]|$))" let regEx = NSRegularExpression(pattern: regExPattern, options: nil, error: nil) let numbersR

我在操场上玩Swift,我创建了一个简单的代码,可以在
123
中翻译字符串,如
onetwotree
开始时,我通过检查for循环中每个字符的大小写状态来实现它,然后我尝试使用正则表达式:

let regExPattern = "(?<=(^|[a-z]))[A-Z][a-z]+(?=([A-Z]|$))"
let regEx = NSRegularExpression(pattern: regExPattern, options: nil, error: nil)

let numbersRegEx = numberNames.map({(name: String) -> Int in

    let matches = regEx.matchesInString(name, options: nil, range: NSMakeRange(0, countElements(name)))

    let digits = matches.map({(match:AnyObject) -> String in

        // lookupString return a String containing
        // the digit corresponding to the passed digit name
        // e.g.  lookupString("Three") -> "3"

        return lookupString(name[match.range.toRange()!.startIndex ..< 
                                 match.range.toRange()!.endIndex])

    })
    return String().join(digits).toInt()!

})

let regexpatern=“(?用于MatcheInstalling的苹果官方文档说:

- (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range
给定此签名,Swift无法知道数组将只包含特定类型的对象

因为Swift编译器无法知道,所以必须将其转换为最通用的结果类型,即AnyObject数组(您至少知道只有对象会出现,因为该方法源自Objective-C)

因此选择了[AnyObject]。
而且,事实上,如果没有任何关于结果NSArray的可空性信息,您得到的可能更接近于[AnyObject]!(NSArray*很可能为零,同样没有可空性信息)-数组中的单个对象不能为零(NSArray不支持将零作为元素),因此假设Swift知道这一点,那么AnyObjects本身就不需要是IUO,因为Swift有类型化数组(由于其泛型支持),所以您可以得到一个包含
AnyObject
的数组,Objective-C只有非类型化的
NSArray
,它可以包含任何类型的对象。文档说明
MatchesInstalling()
返回一个
NSTextCheckingResult
对象数组,但编译器从Objective-C方法签名中不知道这一点:

- (NSArray *)matchesInString:(NSString *)string
                     options:(NSMatchingOptions)options
                       range:(NSRange)range
但是,您可以将此返回值强制转换为
NSTextCheckingResult
数组,如下所示:

let matches = regEx.matchesInString(name, options: nil, 
        range: NSMakeRange(0, countElements(name))) as [NSTextCheckingResult]
不幸的是,如果没有返回任何内容,则会出现运行时错误,因为
nil
无法强制转换为数组,因此最好将
匹配项作为可选项:

let matches = regEx.matchesInString(name, options: nil, 
        range: NSMakeRange(0, countElements(name))) as? [NSTextCheckingResult]
或者使用可选绑定安全访问任何结果(这很好,因为您可以在
else
中轻松处理“未找到的情况”):


谢谢,IUOs是什么?
if let matches = regEx.matchesInString(name, options: nil, 
        range: NSMakeRange(0, countElements(name))) as? [NSTextCheckingResult] {
    // process the matches
} else {
    // invalid number string
}