swift编译器的奇怪行为

swift编译器的奇怪行为,swift,compiler-errors,Swift,Compiler Errors,我在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函数调用中有权访

我在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

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

返回以下内容:

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

问题是b[…]值返回一个UInt32,该UInt32从Swift 1.2开始不再转换为整数。

value
返回一个
UInt32
。将其强制转换为
Int

return Int(b[b.startIndex].value)
或者,您可以让函数返回@GoodbyeStackOverflow提到的
UInt32

func f() -> UInt32

我的问题是,为什么错误是“找不到成员‘值’”,我的问题是为什么错误是“找不到成员‘值’”,我的错是忽略了它。那我想我不太确定。这可能只是一个编译器错误。如果你把它分成
让u=b[b.startIndex];返回u.value
然后您会得到“正确”的错误消息“UInt32不能转换为Int”。同意,编译器并不总是提供正确的错误消息,但原因很明显是UInt32和Int之间的差异