【发布时间】:2014-11-07 17:38:42
【问题描述】:
swift 没有嵌套类吗?
例如,我似乎无法从嵌套类访问主类的属性测试。
class master{
var test = 2;
class nested{
init(){
let example = test; //this doesn't work
}
}
}
【问题讨论】:
swift 没有嵌套类吗?
例如,我似乎无法从嵌套类访问主类的属性测试。
class master{
var test = 2;
class nested{
init(){
let example = test; //this doesn't work
}
}
}
【问题讨论】:
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)
【讨论】:
Master 的正文中,这会起作用:Nested(master:m)?
Nested 在Master 的主体范围内。
这个解决方案有点类似于我在 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)
【讨论】:
为 Swift 和 Java 嵌套
Swift's Nested 更类似于Java's Static Nested,因此您无权访问外部类的属性。要访问外部类,您可以将其作为参数传递。
【讨论】: