Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 快速设置对象';s的性质为零_Ios_Iphone_Swift_Reference_Pass By Reference - Fatal编程技术网

Ios 快速设置对象';s的性质为零

Ios 快速设置对象';s的性质为零,ios,iphone,swift,reference,pass-by-reference,Ios,Iphone,Swift,Reference,Pass By Reference,我是斯威夫特的新手,我面临着一个问题 我的问题很简单: 我有一个简单的类,其中包含一些对象(在它们自己的文件中声明): 我想做的是,当类的一个对象被设置时,将所有其他对象设置为nil,因此我使用了didSet功能并添加了resetData方法,该方法应该将所有对象设置为nil,除了我刚才设置的对象 该类如下所示: class Outcome : NSObject { var foo : SomeClass? { didSet { self.resetData(exe

我是斯威夫特的新手,我面临着一个问题

我的问题很简单:

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

我想做的是,当类的一个对象被设置时,将所有其他对象设置为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
,但问题是,当我设置一个点时,我可以清楚地看到对象不是
nil
,因此这并不是我想要的


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

如注释中所述,循环不会修改类 属性,只有
anObject
循环变量

如果目的是定义一个包含实例的类型 属于
SomeClass
OtherClass
的实例或实例 如果是
另一个类
,则
枚举
将是更好的选择:

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>)
var output=output.foo(SomeClass())
打印(结果)//foo()
// ...
结果=.doo(其他类())
打印(结果)//doo()

anObject=nil
只修改循环变量,而不修改class属性。循环只需将局部变量
anObject
设置为nil。它不会将相关属性设置为
nil
。没有一种简单的方法可以用一个函数实现您想要的功能。您需要在每个
didSet
(即
self.doo=nil
)中将所有其他属性显式设置为
nil
),但这似乎是一件不寻常的事情,可能有更好的方法来实现您真正想要的功能,为什么不使用
enum
(带相关值)相反,如果这些值是互斥的?谢谢Martin,但我不明白,目标是循环到所有其他对象(因为有3个以上的对象),您认为我可以使用enum实现这一点吗?如果您希望一次只有一个属性有值,那么是的,您可以对每个案例使用枚举,每个案例都具有适用于任意数量的可能值的相应关联值类型。这不是我想要做的,我希望在设置结果时某些值为零。这就是我使用循环的原因。在你所做的事情中,结果是有价值的。但是谢谢。@F.Fondacci:不,没有。第二个赋值替换第一个赋值。
var outCome = Outcome.foo(SomeClass())
print(outCome) // foo(<SomeClass: 0x1009000b0>)
// ...

outCome = .doo(OtherClass())
print(outCome) // doo(<OtherClass: 0x100d00540>)