Swift 嵌套类属性

Posted

技术标签:

【中文标题】Swift 嵌套类属性【英文标题】:Swift nested class properties 【发布时间】:2014-11-07 17:38:42 【问题描述】:

swift 没有嵌套类吗?

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

class master
  var test = 2;

  class nested
     init()
       let example = test; //this doesn't work
     
   
 

【问题讨论】:

【参考方案1】:

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

在 Java 中,内部类的实例自动具有对外部类实例的引用(除非内部类声明为 static)。如果您有外部类的实例,则只能创建内部类的实例。这就是为什么在 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)

【讨论】:

谢谢,虽然有点蹩脚,但这是有道理的。我想正因为如此,在 swift 中使用嵌套类的唯一原因是将类捆绑到命名空间类型中,主类是命名空间。 Master 的正文中,这会起作用:Nested(master:m)? 是的,因为NestedMaster 的主体范围内。 @NJGUY 嵌套类可能与组织有关,但也可能与信息隐藏有关。 Swift 在此答案所针对的内容中与 C# 匹配,但 Swift 的 private 修饰符不同,因为它创建了一个项目文件范围,而不是类范围。因此,在 Swift 中嵌套一个类是没有意义的,如果它只是为了私人使用;它可以在主类之外定义,并标记为私有。在 C# 中,private 修饰符不能用于非嵌套类。 如果内部类将父类作为实例变量引用,内部类是否应该将父类保持为弱引用?【参考方案2】:

这个解决方案有点类似于我在 C# 中使用它的方式,并且我已经在 Xcode 中成功测试了它。

以下是该过程的细分:

    您的嵌套类需要设为可选,这样您就不必初始化它,所以有一个“?”在声明中;如果同时初始化父类和嵌套类,最终会产生“递归”效果并生成错误 创建一个常规函数,接收与主类相同类型的参数 将该参数传递给您的嵌套类(这可以进入嵌套对象的普通初始化程序)。 - 由于默认情况下对象是通过引用传递的,因此让您的嵌套类链接到父类没有什么特别的 在嵌套类中,您需要一个与父类相同类型的变量

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

在代码执行区,你的嵌套类对象也需要被视为可选的(因此有'?')。如果你忘记了,Xcode 无论如何都会添加它。

在这个例子中,我想设计一个关键字“set”,所以当我设置变量时,我可以输入:

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)

【讨论】:

【参考方案3】:

为 Swift 和 Java 嵌套

Swift 有 Nested Types 定义 Java 有更复杂的hierarchy of nested class

Swift's Nested 更类似于Java's Static Nested,因此您无权访问外部类的属性。要访问外部类,您可以将其作为参数传递。

【讨论】:

以上是关于Swift 嵌套类属性的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中属性的嵌套类访问方法

swift结构体和类属性-005-swift类结构体基本属性

Swift-存储属性,计算属性,类属性

Swift 属性

嵌套字典的类对象属性访问

如何使用外部类的实例访问嵌套类的属性[重复]