我对swift非常陌生,但精通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
}
现在我试图将if中的表达式组合起来,例如:
if (longUrl.rangeOfString(LEXEMA)? !=nil) {
// blah
}
但是我总是遇到语法错误,上面会产生一个"预期的分隔符"并且无法理解为什么。做了一些测试:
if (absolutePath.rangeOfString(URL_LEXEMA) !=nil) { }
Expected Separator before "!"
if absolutePath.rangeOfString(URL_LEXEMA) !=nil { }
Braced block of statements is an unused closure
我做错了什么?
答案 0 :(得分:5)
如果您来自其他类似Java,您可能会考虑像指针/引用这样的选项,因此习惯于将它们等同于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
}
请注意,您使用的?
后缀行为会在Swift 1.2中发生变化,因此即使您在1.1中编译的问题中的代码也不会在1.2中。
有时你可能会返回一个值,但实际上你并不需要那个值,只是知道它不是零。在这种情况下,您可以在没有let
的情况下将值与nil进行比较:
if longUrl.rangeOfString(LEXEMA) != nil {
// there was a value, but you don't care what that value was
}
尽管如此,上述内容可能更好地表达为:
if longUrl.hasPrefix(LEXEMA) { }
答案 1 :(得分:2)
首先:
您不需要使用if语句括号,除非您有嵌套的括号括号表达式。
可以从=
的右侧看出来。很多时候,Swift可以解决它,你可以告诉Swift可以解决它,所以你可以避免那种多余的混乱。
你做需要指定类型,如果Swift无法从中找出类型 右边。例如:
例如,请考虑以下几行:
=
斯威夫特可以发现他们是弦乐。
此函数或类返回UIView:
let LEXEMA = "http://"
let longUrl = "http://badgirls.many/picture.png"
考虑一下:
var myView = ViewReturningClassOrFunc()
在上面一行中,Swift无法提前确定它将被分配@IBOutlet var myView : UIView!
,因此您必须提供类型。通过在结尾处提供UIView
,您已将其设为隐式展开的可选项。这意味着,就像!
一样,您指出它可以是?
,但您确信它在您访问它时永远不会nil
,因此Swift赢了& #39; t要求您在引用它之后放置nil
。这个技巧可以节省时间和方便。
你不应该添加?到线:
!
另一个答案指出,你错过了这个。
if (longUrl.rangeOfString(URL_LEXEMA) !=nil) {
答案 2 :(得分:0)
swift是区分大小写的语言。您还需要检查空白
if longUrl.rangeOfString(LEXEMA) != nil {
//your condition
}
声明之间应该有空格!= nil
答案 3 :(得分:-1)
只需在!=
和nil
之间添加一个空格,如:
if longUrl.rangeOfString(LEXEMA) != nil {
// blah
}
我在游乐场测试了您的代码,报告了预期','分隔符错误。
不要忘记 1s和0s 以及 Airspeed Velocity 所说的规则。