Swift:可选的数组计数

时间:2014-06-30 13:04:05

标签: arrays swift optional

在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.

这是正确的方法吗?或者有更简单的东西吗?

3 个答案:

答案 0 :(得分:26)

尝试使用nil coalescing operator

根据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。如果nilitem,NSOutlineView并不关心 - 它只想知道显示children 0所需的行数

因此,如果childrennil,则在这种情况下返回0非常有意义。调用该函数的唯一原因是确定NSOutlineView需要多少行。它并不关心答案是children,因为return (children?.count ?? 0)是零或因为它是空的。

children会做我需要的。如果nil0,则会返回count。否则它将返回{{1}}。完美!

答案 1 :(得分:6)

这看起来更简单。

Objective-C代码较短,因为nil也是0的形式,是基于C语言。

由于swift是强类型的,你没有这样的速记。在这种特殊情况下,它需要更多的努力,但一般来说,它可以节省您因松散打字而导​​致的大部分麻烦。


关于具体情况,是否有理由首先使阵列成为可选项?你可以只有一个空数组。这样的事可能适合你:

var myArray: Array<String> = []

func numberOfObjectsInMyArray() -> Int {
   return myArray.count
}

Source for this information

答案 2 :(得分:3)

如何使用optional作为返回值?

var myArray: Array<String>?

func numberOfObjectsInMyArray() -> Int? {
    return myArray?.count
}

我认为这种方式更安全。

Source for this information