只是出于乐趣,我测试了这种功能是否真的起作用:
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
答案 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
。