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)
?
是的,因为Nested
在Master
的主体范围内。
@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 classSwift's Nested
更类似于Java's Static Nested
,因此您无权访问外部类的属性。要访问外部类,您可以将其作为参数传递。
【讨论】:
以上是关于Swift 嵌套类属性的主要内容,如果未能解决你的问题,请参考以下文章