在Objective-C中,如果我有以下属性:
@property (strong, nonatomic) NSArray * myArray;
在myArray
中返回多个对象的方法如下所示:
- (NSInteger) numberOfObjectsInMyArray
{
return [self.myArray count];
}
这将返回数组中的对象数,如果myArray == nil
,则返回0;
在Swift中我能想到的最好的等价物是:
var myArray: Array<String>?
func numberOfObjectsInMyArray() -> Int
{
return myArray ? myArray!.count : 0
}
因此检查可选数组包含一个值,如果是,则解包该数组并返回该值,否则返回0.
这是正确的方法吗?或者有更简单的东西吗?
答案 0 :(得分:26)
根据Apple文档:
nil合并运算符(a ?? b)如果包含值,则展开可选的a;如果a为n,则返回默认值b。
所以你的功能看起来像这样:
func numberOfObjectsInMyArray() -> Int {
return (myArray?.count ?? 0)
}
我同意其他人的看法,这可能是一个糟糕的主意,原因有很多(例如,看起来有一个数字计数为&#34; 0&#34;当实际上没有所有的数组)但是,即使是糟糕的想法也需要实现。
编辑:
所以我添加了这个,因为在我发布这个答案两分钟后,我发现了完全符合作者想要做的事情。
我正在Swift中实现NSOutlineViewDataSource协议。该协议所要求的功能之一是:
optional func outlineView(_ outlineView: NSOutlineView,
numberOfChildrenOfItem item: AnyObject?) -> Int
该函数要求您返回item
参数的子项数。在我的代码中,如果项目有任何子项,它们将存储在数组var children: [Person]?
我没有初始化该数组,直到我实际将一个子项添加到数组中。
换句话说,在我向NSOutlineView提供数据时,children
可以是nil
或者可以填充,或者可以填充一次,但随后删除了所有对象从它开始,在这种情况下它不会nil
,但count
0
将是children
。如果nil
为item
,NSOutlineView并不关心 - 它只想知道显示children
0
所需的行数
因此,如果children
为nil
,则在这种情况下返回0
非常有意义。调用该函数的唯一原因是确定NSOutlineView需要多少行。它并不关心答案是children
,因为return (children?.count ?? 0)
是零或因为它是空的。
children
会做我需要的。如果nil
为0
,则会返回count
。否则它将返回{{1}}。完美!
答案 1 :(得分:6)
这看起来更简单。
Objective-C代码较短,因为nil
也是0的形式,是基于C语言。
由于swift是强类型的,你没有这样的速记。在这种特殊情况下,它需要更多的努力,但一般来说,它可以节省您因松散打字而导致的大部分麻烦。
关于具体情况,是否有理由首先使阵列成为可选项?你可以只有一个空数组。这样的事可能适合你:
var myArray: Array<String> = []
func numberOfObjectsInMyArray() -> Int {
return myArray.count
}
答案 2 :(得分:3)
如何使用optional
作为返回值?
var myArray: Array<String>?
func numberOfObjectsInMyArray() -> Int? {
return myArray?.count
}
我认为这种方式更安全。