我有一个用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
答案 0 :(得分:1)
错误消息告诉我们问题:
- [NSNull countByEnumeratingWithState:objects:count:]:发送到实例的无法识别的选择器
您的attribute.values
不是或NSMutableArray
。这是[NSNull null]
。
NSNull
是一个真实的对象,在集合中使用而不是nil,因为常见的Foundation集合(NSArray
和NSDictionary
)不能将nil存储为值。 / p>
从JSON解码数据结构时,我们经常遇到NSNull
。当JSON解码器在数组或对象中找到null
(JSON文字)时,它会将[NSNull null]
存储在相应的NSArray
或NSDictionary
中。
这样的事情应该有效:
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注释的更多信息。