Swift嵌套的类属性

swift没有嵌套类吗?

例如,我似乎无法从嵌套类访问主类的属性testing。

class master{ var test = 2; class nested{ init(){ let example = test; //this doesn't work } } } 

Swift的嵌套类不像Java的嵌套类。 那么,它们就像一种Java的嵌套类,但不是你想的那种。

在Java中,内部类的实例会自动引用外部类的实例(除非内部类声明为static )。 如果您有外部类的实例,则只能创build内部类的实例。 这就是为什么在Java中,你会说这样的this.new nested()

在Swift中,内部类的实例独立于外部类的任何实例。 就好像Swift中的所有内部类都是使用Java的static方法声明的。 如果您希望内部类的实例具有对外部类的实例的引用,则必须明确指出:

 class Master { var test = 2; class Nested{ init(master: Master) { let example = master.test; } } func f() { // Nested is in scope in the body of Master, so this works: let n = Nested(master: self) } } var m = Master() // Outside Master, you must qualify the name of the inner class: var n = Master.Nested(master:m) // This doesn't work because Nested isn't an instance property or function: var n2 = m.Nested() // This doesn't work because Nested isn't in scope here: var n3 = Nested(master: m) 

这个解决scheme与我在C#中使用它的方式类似,我已经在Xcode中成功地进行了testing。

以下是这个过程的细节:

  1. 你的嵌套类需要做成可选的,所以你不必初始化它,所以它们是'?' 在宣言中; 如果初始化父类和嵌套类,则最终会产生“recursion”效果,并生成错误
  2. 创build一个接收与您的主类相同types的参数的常规函数
  3. 将这个parameter passing给你的嵌套类(这可以进入嵌套对象的普通初始化)。 – 由于默认情况下通过引用传递对象,所以没有什么特别的要让你的嵌套类链接到父类
  4. 在你的嵌套类中,你需要一个和父类相同types的variables

从这里开始,像往常一样设置一切。

在代码执行区域中,您的嵌套类对象也需要被视为可选(因此是'?')。 如果你忘了它,Xcode会添加它。

在这个例子中,我想devise一个关键字“set”,所以当我设置variables时,我可以input:

 testClass.set.(and then a descriptive method name) 

这里是代码,它的目标是在通过嵌套对象设置值之后在控制台中输出“test”:

 class testClass { var test_string:String = "" var set: class_set? func construct_objects(argument: testClass) { self.set = class_set(argument: argument) } class class_set { var parent:testClass init(argument: testClass) { parent = argument } func test_string_to_argument(argument: String) { parent.test_string = argument } } } var oTestClass = testClass() oTestClass.construct_objects(oTestClass) oTestClass.set?.test_string_to_argument("test") print(oTestClass.test_string)