在swift中,当我的类具有相同名称的子类时,如何引用最顶层的类

时间:2015-06-24 14:28:40

标签: ios swift

在斯威夫特:

  • 如何为myObject变量指定最顶层的innerObj
  • swift是否有某种命名空间操作符可以让我从全局命名空间创建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?")
        }
    }

}

3 个答案:

答案 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?")
        }
    }

}

然后,您可以使用这两个类,编译器会以不同的方式确定用例。