如何测试Swift中来自ObjC对象的@property是否为nil?

时间:2015-10-30 17:09:52

标签: objective-c swift

我有一个用Objective-C编写的模型对象,它具有NSMutableArray类型的属性。

它可以是nil或具有有效的对象引用。

我正在使用桥接头,我有一些用Swift编写的文件。

在Swift文件中,我想遍历数组中的对象,只有它中包含某些东西。

我怎样才能做到这一点?

我尝试了以下内容:

   if let a = MyObj.myArray {
   }
   if(MyObj.myArray != nil) {
   }
   if(MyObj.myArray != NSNull()) {
   }

我终于单独使用Swift代码中的选项,但是当我在Swift代码中传递用Objective-C编写的对象时,我无法理解这种行为。

我的实际代码如下所示: 代码:

if let values = attribute.values {
    for val in values {
        print(val);
    }
    return true;
}

Exception:

-[NSNull countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance

2 个答案:

答案 0 :(得分:1)

错误消息告诉我们问题:

  

- [NSNull countByEnumeratingWithState:objects:count:]:发送到实例的无法识别的选择器

您的attribute.values不是或NSMutableArray。这是[NSNull null]

NSNull是一个真实的对象,在集合中使用而不是nil,因为常见的Foundation集合(NSArrayNSDictionary)不能将nil存储为值。 / p>

从JSON解码数据结构时,我们经常遇到NSNull。当JSON解码器在数组或对象中找到null(JSON文字)时,它会将[NSNull null]存储在相应的NSArrayNSDictionary中。

这样的事情应该有效:

if let values = attribute.values where values != NSNull() {
    for val in values {
        print(val);
    }
    return true;
}

答案 1 :(得分:0)

您应该为Objective-C属性使用新的Nullability注释语法。无论您是否打算将对象设为零,这些注释都有助于与Swift进行通信。例如:

@property (nullable) NSMutableArray* myArray;

使用这些注释,您的Objective-C对象应该像本机Swift对象一样工作。您可以执行if let或任何其他nil检查。

if let arr = myObject.myArray {
    // Do something with arr
}
else {
    // Object is nil do something else
}

if myObject.myArray == nil {
    // Array is nil, handle it.
}

您可以在Apple Swift博客上阅读有关Objective-C的Nullability注释的更多信息。

https://developer.apple.com/swift/blog/?id=25