我非常喜欢快速,但精通Java,JavaScript,C等其他语言......在创建表达式时,我迷失了Swift语法.看看这个基本的例子,我只是通过调用String.rangeOfString
返回一个Optional Range
(Range?
)来确定一个字符串是否包含在另一个字符串中
这按预期工作:
let LEXEMA:String="http://"
let longUrl:String="http://badgirls.many/picture.png"
let range=longUrl.rangeOfString(LEXEMA);
if (range? != nil) {
// blah
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试将if中的表达式组合起来,例如:
if (longUrl.rangeOfString(LEXEMA)? !=nil) {
// blah
}
Run Code Online (Sandbox Code Playgroud)
但我总是得到语法错误,上面会产生一个"预期的分隔符"并且无法理解为什么.做了一些测试:
if (absolutePath.rangeOfString(URL_LEXEMA) !=nil) { }
Expected Separator before "!"
if absolutePath.rangeOfString(URL_LEXEMA) !=nil { }
Braced block of statements is an unused closure
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
如果你来自像Java这样的其他人,你可能会考虑像指针/引用这样的选项,所以习惯于将它们等同于nil
非nil,使用它们.但这可能会导致更多混乱.相反,将它们视为可能结果的容器,需要打开才能使用. if let
结合了测试和解包操作.
考虑到这一点,以下是您可以调整代码的方法:
let LEXEMA: String="http://"
let longUrl: String="http://badgirls.many/picture.png"
if let range = longUrl.rangeOfString(LEXEMA) {
// use range, which will be the unwrapped non-optional range
}
else {
// no such range, perhaps log an error if this shouldn’t happen
}
Run Code Online (Sandbox Code Playgroud)
请注意,?
您使用的后缀行为在Swift 1.2中有所改变,因此即使您在1.1中编译的问题中的代码也不会在1.2中.
有时你可能会返回一个值,但实际上并不需要这个值,只是知道它不是零.在这种情况下,您可以将值与nil进行比较,而不是let
:
if longUrl.rangeOfString(LEXEMA) != nil {
// there was a value, but you don't care what that value was
}
Run Code Online (Sandbox Code Playgroud)
也就是说,以上内容可能更好地表达为:
if longUrl.hasPrefix(LEXEMA) { }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
107 次 |
最近记录: |