Swift将对象的属性设置为nil

时间:2017-07-05 08:25:50

标签: ios iphone swift reference pass-by-reference

我是Swift的新手,我遇到了一个问题。

我的问题很简单:

我有一个简单的类,其中包含一些对象(在自己的文件中声明):

class Outcome : NSObject {
   var foo : SomeClass? 
   var doo : OtherClass?
   var roo: AnotherClass?

}

我想要做的是当设置类的对象时,将所有其他对象设置为nil,因此我使用了didSet功能并添加了一个应该设置的resetData方法所有对象nil,除了我刚设置的对象。

该课程如下:

    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,但问题是当我设置一个beakpoint时我可以清楚地看到该对象不是nil,所以这不做我想要的是。

我认为这是一个参考问题,我真的不明白,是否可以将对象设置为ni l?有一个更好的方法吗 ?

1 个答案:

答案 0 :(得分:2)

如评论中所述,您的循环不会修改类 属性,只有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>)

用法示例:

AndroidRuntime: FATAL EXCEPTION main
java.lang.IllegalArgumentException: View:DecorView@fbad[Starting Verification Process] not attached to window manager