在斯威夫特:
myObject
变量指定最顶层的innerObj
? myObject
?请考虑以下代码。
//my object that can init with a message=string
class MyObject {
init(message: String) {
println(message)
}
}
//here I define a global works fine
let global = myObject(message: "this works")
//other class
class ViewController: UIViewController {
//defines an inner class with same name
class MyObject {
func failsFunction(){
//cannot invoke initializer for type "ViewController.myObject" with an argument of type (String)
let innerObj = myObject("how can I refer to the topmost myObject here?")
}
}
}
答案 0 :(得分:3)
我的第一个答案是"不要这样做。"它在技术上是合法的,因为这两个类别具有独特的范围,但它会让人感到困惑,并且在你回到这个代码后6个月后会回来咬你。请记住,您有一个全局类和一个具有相同名称的ViewController子类。
如果您要忽略该建议,Lou提供了您的解决方案:在顶层创建一个typeAlias并在ViewController类中使用它,以便您可以在ViewController中引用全局类。
其次,类名应以大写字母开头。因此class myObject
应为class MyObject
。这是该语言的文档惯例。
第三,myObject
是一个可怕的名字。它并不能让你知道这个课程的用途。即使这是一项学习练习,您仍应遵循良好的编码习惯。它培养了良好的习惯,测试代码有一种在实际项目中找到自己的方式,或者在某个地方发布为演示代码,或者其他什么。
答案 1 :(得分:1)
在隐藏它之前,您需要使用别名:
typealias GlobalMyObject = MyObject
答案 2 :(得分:1)
一种通常的方法是将外部类绑定到struct中。此模式与创建命名空间非常相似。你可以这样做
struct MyNameSpace {
class myObject {
init(message: String) {
print(message)
}
}
}
//here I define a global works fine
let global = MyNameSpace.myObject(message: "this works")
//other class
class ViewController: UIViewController {
//defines a subclass with same name
class myObject {
func failsFunction(){
//cannot invoke initializer for type "ViewController.myObject" with an argument of type (String)
let innerObj = MyNameSpace.myObject(message: "how can I refer to the topmost myObject here?")
}
}
}
然后,您可以使用这两个类,编译器会以不同的方式确定用例。