【问题标题】:Strange behavior with swift compiler快速编译器的奇怪行为
【发布时间】:2015-05-19 19:36:45
【问题描述】:

我在swift中有以下功能:

func f() -> Int
{
    let a = String("a")
    let b = a.unicodeScalars
    println(b[b.startIndex].value)

   //return b[b.startIndex].value
   return 1
}

如果我取消注释第一个 return 语句并注释第二个,那么我得到编译器错误:

找不到成员“值”

为什么即使我可以在 println 函数调用中访问该成员,也会发生这种情况?

编辑

为了使问题更清楚,请考虑以下代码:

struct point {
    var x: UInt32
    var y: UInt32

    init (x: UInt32, y: UInt32) {
        self.x = x
        self.y = y
    }
}

func f () -> Int {
    var arr = [point(x: 0, y: 0)]
    return arr[0].x
}

在这种情况下,编译器错误是:

UInt32 不能转换为 Int

我的问题是:为什么即使两种情况下的问题相同,编译器错误也会不同?

【问题讨论】:

  • 这可能只是一个编译器错误。如果将其拆分为let u = b[b.startIndex] ; return u.value,则会收到“正确”错误消息“UInt32 不可转换为 Int”。
  • 同意,编译器并不总是提供正确的错误消息,但原因很明显是差异。 UInt32 和 Int 之间

标签: swift compiler-errors


【解决方案1】:

value 返回一个UInt32。将其投射到Int

return Int(b[b.startIndex].value)

或者,您可以让函数返回 @GoodbyeStackOverflow 提到的 UInt32

func f() -> UInt32

【讨论】:

  • 击败我,要么强制转换为 Int,要么让函数返回 UInt32
  • 我的问题是为什么错误是“找不到成员'值'”
【解决方案2】:

改为返回:

return Int(b[b.startIndex].value)

问题在于 b[...].value 返回一个 UInt32,从 Swift 1.2 开始,它不再转换为 Int。

【讨论】:

  • 我的问题是为什么错误是“找不到成员'值'”
  • 我忽略了这一点。那我想我不完全确定。为好问题投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多