嵌套在函数中的快速结构

时间:2018-06-20 15:48:33

标签: swift function struct nested

只是出于乐趣,我测试了这种功能是否真的起作用:

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

令人惊讶的是。我的问题是现在:它是否可以从该函数访问x?当然这行不通:

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

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

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

print((example as! /* What to use here? */).x)

令人惊讶的是,print(type(of: example))打印出正确的字符串Example

1 个答案:

答案 0 :(得分:3)

如@rmaddy在评论中所述,Example的范围是函数,不能在函数(包括函数的返回类型)之外使用。

因此,您无需访问类型x就可以得到Example的值吗?是的,如果您使用protocol来定义具有属性x的类型并让Example采用该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)
2

实际上,这并不是真正的问题。您只需在函数和所有调用者可见的级别上定义Example