我试图在一个选项String上调用substringWithRange但是经过多次实验仍然无法让它编译:
var mdn:String?
var subscriber = CTSubscriber()
var carrierToken = subscriber.carrierToken
mdn = NSString(data:carrierToken, encoding:NSUTF8StringEncoding)
let range:NSRange = NSRange(location: 0, length: 10)
if mdn
{
let subString = mdn!.substringWithRange(range)
}
这将导致编译错误,指出未解包可选NSString的值。 我以为它已经被打开了! 如果我删除!然后我得到一个错误说String?没有名为substringWithRange的成员。
答案 0 :(得分:2)
替换
var mdn:String?
与
var mdn:NSString?
您正在使用var存储NSString
,因此您应该为其指定正确的类型。虽然String
和NSString
可以相互分配,但它的类型不同。
String
没有substringWithRange
方法。
答案 1 :(得分:0)
我认为这实际上可能是编译器错误。我会向Apple报告,看看他们是如何回来的。
但是,如果您需要从中获取某些信息,请使用正确的方法来展开可选项。 (就像在你的例子中获得子字符串一样)是:
if let theMdn = mdn {
let subString = theMdn.substringWithRange(range)
}
这样,只有在解包成功时才会执行您的代码块。
编辑: Sulthan的回答可能更准确。但是我仍然认为如果你可以在let
块中打开可选项,你应该能够手动完成。