Swift 基本表达
Swift basic expression
我是 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
}
但我总是遇到语法错误,上面会产生 "Expected Separator" 并且不明白为什么。做了更多测试:
if (absolutePath.rangeOfString(URL_LEXEMA) !=nil) { }
Expected Separator before "!"
if absolutePath.rangeOfString(URL_LEXEMA) !=nil { }
Braced block of statements is an unused closure
我做错了什么?
初学者:
您 不需要 if 语句的括号,除非您有嵌套的括号子表达式需要它。
您不需要在 let 或 var 声明的 =
左侧指定类型 ifSwift可以从=
的右边算出来。很多时候Swift都能算出来,你可以说Swift也能算出来,这样你就可以避免那些多余的杂乱。
你做如果Swift无法从
右侧。示例:
例如,考虑以下几行:
let LEXEMA = "http://"
let longUrl = "http://badgirls.many/picture.png"
Swift 可以看出是字符串。
对于此功能或 class 类似 returns 一个 UIView:
var myView = ViewReturningClassOrFunc()
考虑一下:
@IBOutlet var myView : UIView!
在上面的行中,Swift无法提前计算出它会被分配一个UIView
,所以你必须提供类型。通过在末尾提供 !
,您已将其设为 隐式解包 可选。这意味着,就像 ?
,你表示它可以是 nil
,但你确信它在你访问它时永远不会是 nil
,所以 Swift 不会要求您在引用它时在其后加上 !
。这个技巧既省时又方便。
你不应该添加 ?到行:
if (longUrl.rangeOfString(URL_LEXEMA) !=nil) {
正如另一个答案所指出的,您错过了 let。
if let longUrl.rangeOfString(URL_LEXEMA) {
println("What do I win? :-)")
}
如果您来自其他 Java,您可能会想到像 pointers/references 这样的可选值,因此习惯于将它们等同于 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 中编译。
有可能有时候你在想是否有返回值,但实际上你并不需要那个值,只是想知道它不是 nil。在这种情况下,您可以在不使用 let
:
的情况下将值与 nil 进行比较
if longUrl.rangeOfString(LEXEMA) != nil {
// there was a value, but you don't care what that value was
}
也就是说,以上可能更好地表达为:
if longUrl.hasPrefix(LEXEMA) { }
只需在 !=
和 nil
之间添加一个 space,例如:
if longUrl.rangeOfString(LEXEMA) != nil {
// blah
}
我在 playground 中测试了你的代码,报告了 Expected ',' separator 错误。
并且不要忘记 1s 和 0s 和 Airspeed Velocity 所说的规则。
swift 是区分大小写的语言。你还需要检查一下 whitespaces
if longUrl.rangeOfString(LEXEMA) != nil {
//your condition
}
语句之间应该有space != nil
我是 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
}
但我总是遇到语法错误,上面会产生 "Expected Separator" 并且不明白为什么。做了更多测试:
if (absolutePath.rangeOfString(URL_LEXEMA) !=nil) { }
Expected Separator before "!"
if absolutePath.rangeOfString(URL_LEXEMA) !=nil { }
Braced block of statements is an unused closure
我做错了什么?
初学者:
您 不需要 if 语句的括号,除非您有嵌套的括号子表达式需要它。
您不需要在 let 或 var 声明的
=
左侧指定类型 ifSwift可以从=
的右边算出来。很多时候Swift都能算出来,你可以说Swift也能算出来,这样你就可以避免那些多余的杂乱。你做如果Swift无法从 右侧。示例:
例如,考虑以下几行:
let LEXEMA = "http://"
let longUrl = "http://badgirls.many/picture.png"
Swift 可以看出是字符串。
对于此功能或 class 类似 returns 一个 UIView:
var myView = ViewReturningClassOrFunc()
考虑一下:
@IBOutlet var myView : UIView!
在上面的行中,Swift无法提前计算出它会被分配一个UIView
,所以你必须提供类型。通过在末尾提供 !
,您已将其设为 隐式解包 可选。这意味着,就像 ?
,你表示它可以是 nil
,但你确信它在你访问它时永远不会是 nil
,所以 Swift 不会要求您在引用它时在其后加上 !
。这个技巧既省时又方便。
你不应该添加 ?到行:
if (longUrl.rangeOfString(URL_LEXEMA) !=nil) {
正如另一个答案所指出的,您错过了 let。
if let longUrl.rangeOfString(URL_LEXEMA) {
println("What do I win? :-)")
}
如果您来自其他 Java,您可能会想到像 pointers/references 这样的可选值,因此习惯于将它们等同于 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 中编译。
有可能有时候你在想是否有返回值,但实际上你并不需要那个值,只是想知道它不是 nil。在这种情况下,您可以在不使用 let
:
if longUrl.rangeOfString(LEXEMA) != nil {
// there was a value, but you don't care what that value was
}
也就是说,以上可能更好地表达为:
if longUrl.hasPrefix(LEXEMA) { }
只需在 !=
和 nil
之间添加一个 space,例如:
if longUrl.rangeOfString(LEXEMA) != nil {
// blah
}
我在 playground 中测试了你的代码,报告了 Expected ',' separator 错误。
并且不要忘记 1s 和 0s 和 Airspeed Velocity 所说的规则。
swift 是区分大小写的语言。你还需要检查一下 whitespaces
if longUrl.rangeOfString(LEXEMA) != nil {
//your condition
}
语句之间应该有space != nil