Swift 将对象的属性设置为 nil
Swift setting object's properties to nil
我是 Swift 的新手,我遇到了一个问题。
我的问题很简单:
我有一个简单的 class,里面有一些对象(在他们自己的文件中声明):
class Outcome : NSObject {
var foo : SomeClass?
var doo : OtherClass?
var roo: AnotherClass?
}
我想做的是当设置了class的一个对象时,将所有其他对象设置为nil,所以我使用了didSet
特性并添加了一个resetData
应该将所有对象设置为 nil
的方法,除了我刚刚设置的对象。
class 看起来像这样:
class Outcome : NSObject {
var foo : SomeClass? {
didSet { self.resetData(exeption: foo!) }
var doo : OtherClass? {
didSet { self.resetData(exeption: doo!) }
}
var roo: AnotherClass? {
didSet { self.resetData(exeption: roo!) }
}
func resetData (exeption: AnyObject) {
var allObjects = NSArray(array: [self.foo ?? NSNull(), self.doo ?? NSNull(), self.roo ?? NSNull()])
for var anObject in (allObjects as NSArray as! [NSObject?]) {
if exeption.isEqual(anObject) == false {
anObject = nil
}
}
}
}
resetData 方法的想法是将所有对象设置为 nil
除了异常(这是我刚刚在我的视图控制器中设置的对象)
代码正常,指令anObject = nil
被执行,但问题是当我设置一个set a beakpoint时我可以清楚地看到对象不是nil
,所以这确实不做我想做的事。
我觉得是引用的问题,我不是很懂,能不能给ni
l设置一个对象?有一个更好的方法吗 ?
如评论中所述,您的循环不会修改 class
属性,只有 anObject
循环变量。
如果打算定义一个包含 实例的类型
SomeClass
或的实例 OtherClass
或的实例
AnotherClass
那么 enum
会是更好的选择:
enum Outcome {
case foo(SomeClass)
case doo(OtherClass)
case roo(AnotherClass)
}
用法示例:
var outCome = Outcome.foo(SomeClass())
print(outCome) // foo(<SomeClass: 0x1009000b0>)
// ...
outCome = .doo(OtherClass())
print(outCome) // doo(<OtherClass: 0x100d00540>)
我是 Swift 的新手,我遇到了一个问题。
我的问题很简单:
我有一个简单的 class,里面有一些对象(在他们自己的文件中声明):
class Outcome : NSObject {
var foo : SomeClass?
var doo : OtherClass?
var roo: AnotherClass?
}
我想做的是当设置了class的一个对象时,将所有其他对象设置为nil,所以我使用了didSet
特性并添加了一个resetData
应该将所有对象设置为 nil
的方法,除了我刚刚设置的对象。
class 看起来像这样:
class Outcome : NSObject {
var foo : SomeClass? {
didSet { self.resetData(exeption: foo!) }
var doo : OtherClass? {
didSet { self.resetData(exeption: doo!) }
}
var roo: AnotherClass? {
didSet { self.resetData(exeption: roo!) }
}
func resetData (exeption: AnyObject) {
var allObjects = NSArray(array: [self.foo ?? NSNull(), self.doo ?? NSNull(), self.roo ?? NSNull()])
for var anObject in (allObjects as NSArray as! [NSObject?]) {
if exeption.isEqual(anObject) == false {
anObject = nil
}
}
}
}
resetData 方法的想法是将所有对象设置为 nil
除了异常(这是我刚刚在我的视图控制器中设置的对象)
代码正常,指令anObject = nil
被执行,但问题是当我设置一个set a beakpoint时我可以清楚地看到对象不是nil
,所以这确实不做我想做的事。
我觉得是引用的问题,我不是很懂,能不能给ni
l设置一个对象?有一个更好的方法吗 ?
如评论中所述,您的循环不会修改 class
属性,只有 anObject
循环变量。
如果打算定义一个包含 实例的类型
SomeClass
或的实例 OtherClass
或的实例
AnotherClass
那么 enum
会是更好的选择:
enum Outcome {
case foo(SomeClass)
case doo(OtherClass)
case roo(AnotherClass)
}
用法示例:
var outCome = Outcome.foo(SomeClass())
print(outCome) // foo(<SomeClass: 0x1009000b0>)
// ...
outCome = .doo(OtherClass())
print(outCome) // doo(<OtherClass: 0x100d00540>)