嵌套在函数中的 swift 结构

Jos*_*ler 2 struct nested function swift

只是为了好玩,我测试了一下,如果这样的功能真的有效:

func exampleFunction() -> Any {
    struct Example {
        let x: Int
    }
    let example = Example(x: 2)
    return example
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是。我现在的问题是:它是否能够例如x从函数访问?当然这是行不通的:

let example = exampleFunction()
print(example.x)         
//Error: Value of type 'Any' has no member 'x'
Run Code Online (Sandbox Code Playgroud)

它必须先进行类型转换,但使用哪种类型?

let example = exampleFunction()
print((example as! Example).x)
//Of course error: Use of undeclared type 'Example'

print((example as! /* What to use here? */).x)
Run Code Online (Sandbox Code Playgroud)

出人意料地print(type(of: example))打印出正确的字符串Example

vac*_*ama 5

正如@rmaddy 在评论中解释的那样,范围Example是函数,不能在函数之外使用,包括函数的返回类型。

那么,您能否在x无法访问类型的情况下获得 的值Example?是的,如果您使用 aprotocol来定义具有属性的类型xExample采用该类型,则可以protocol

protocol HasX {
    var x: Int { get }
}

func exampleFunction() -> Any {
    struct Example: HasX {
        let x: Int
    }
    let example = Example(x: 2)

    return example
}

let x = exampleFunction()
print((x as! HasX).x)
Run Code Online (Sandbox Code Playgroud)
2
Run Code Online (Sandbox Code Playgroud)

在实践中,这并不是真正的问题。您只需Example在对函数和任何调用者可见的级别进行定义。

  • “也许未来的版本会为此提供解决方案” _what_ 的“解决方案”?本地就是本地。斯威夫特在这里的行为完全正确。 (7认同)
  • _可以_指定类型的范围:在另一个类型声明的顶层声明它。就像嵌套枚举!任何类型声明都可以声明任何类型的类型声明:这就是嵌套类型_are_。这_不是_嵌套类型。它是其花括号的局部。结束。 (2认同)