【问题标题】:Multiline statement in SwiftSwift 中的多行语句
【发布时间】:2015-08-18 11:22:16
【问题描述】:

我正在编写一个 Swift 教程,发现 Swift 有一种奇怪的方式来处理多行语句。

首先,我为标准String 类定义了一些扩展:

extension String {
    func replace(target: String, withString: String) -> String {
        return self.stringByReplacingOccurrencesOfString(target, withString: withString)
    }

    func toLowercase() -> String {
        return self.lowercaseString
    }
}

这按预期工作:

let str = "HELLO WORLD"
let s1 = str.lowercaseString.replace("hello", withString: "goodbye") // -> goodbye world

这不起作用:

let s2 = str
            .lowercaseString
            .replace("hello", withString: "goodbye")
// Error: could not find member 'lowercaseString'

如果我用函数调用替换对 lowercaseString 属性的引用,它会再次起作用:

let s3 = str
            .toLowercase()
            .replace("hello", withString: "goodbye") // -> goodbye world

在 Swift 语言规范中是否有任何内容阻止属性被拆分到自己的行中?

代码Swift Stub

【问题讨论】:

    标签: swift multiline


    【解决方案1】:

    这绝对是一个编译器错误。问题已在 Xcode 7 beta 3 中解决。

    【讨论】:

      【解决方案2】:

      这感觉像是一个编译器错误,但这与您可以在 Swift 中定义前缀、中缀和后缀运算符这一事实有关(但讽刺的是,不能定义 . 运算符)。我不知道为什么它只会让你对属性而不是函数调用感到悲伤,而是两件事的结合:

      • . 前后的空格。属性的(点)运算符(仅限)
      • 这种不断发展的语言的一些细微差别对待属性不同于函数调用(即使函数应该是第一类类型)。

      我会提交一个错误以查看它的结果,pythonic 不应该以这种方式使用 Swift。也就是说,要解决这个问题,您既可以不破坏类型中的属性,也可以在 . 之前和之后添加一个空格。

      let s2 = str.lowercaseString
          .replace("hello", withString: "goodbye")
      
      let s3 = str
          . lowercaseString
          .replace("hello", withString: "goodbye")
      

      【讨论】:

        【解决方案3】:

        在 swift 中使用分号不是强制性的。而且我认为 swift 中多行语句的问题是由于可选的分号。

        请注意,swift 不支持多行字符串。在这里查看:Swift - Split string over multiple lines

        所以也许 swift 不能处理多行语句。我不确定这一点,这可能是原因之一,所以如果其他人可以就这个问题提供帮助,我将不胜感激。

        【讨论】:

          猜你喜欢
          • 2020-07-08
          • 1970-01-01
          • 2015-12-22
          • 2021-04-02
          • 2014-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多