Swift:可选的数组计数

Ash*_*lls 6 arrays optional swift

在Objective-C中,如果我有以下属性:

@property (strong, nonatomic) NSArray * myArray;
Run Code Online (Sandbox Code Playgroud)

返回多个对象的myArray方法如下所示:

- (NSInteger) numberOfObjectsInMyArray
{
    return [self.myArray count];
}
Run Code Online (Sandbox Code Playgroud)

这将返回数组中对象的数量,或者返回0 myArray == nil;

在Swift中我能想到的最好的等价物是:

var myArray: Array<String>?

func numberOfObjectsInMyArray() -> Int
{
   return myArray ? myArray!.count : 0
}
Run Code Online (Sandbox Code Playgroud)

因此,检查可选数组包含一个值,如果是,则解包该数组并返回该值,否则返回0.

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

Aar*_*sen 26

尝试使用nil合并运算符.

根据Apple文档:

如果a包含值,则nil合并运算符(a ?? b)展开可选a;如果a为n,则返回默认值b.

所以你的功能可能如下所示:

    func numberOfObjectsInMyArray() -> Int {
        return (myArray?.count ?? 0)
    }
Run Code Online (Sandbox Code Playgroud)

我同意其他人的说法,这可能是一个糟糕的主意,原因有很多(例如,当实际上根本没有数组时,看起来有一个数字为"0"的数组)但是嘿,甚至是坏主意需要实施.

编辑:

所以我添加这个是因为在我发布这个答案两分钟之后,我发现了完全符合作者想要做的事情的原因.

我正在Swift中实现NSOutlineViewDataSource协议.协议要求的功能之一是:

optional func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: AnyObject?) -> Int

该函数要求您返回item参数的子项数.在我的代码中,如果项目有任何子项,它们将存储在数组中,var children: [Person]?

在我实际将数组添加到数组之前,我没有初始化该数组.

换句话说,在我向NSOutlineView提供数据的时候,children可能是nil 或者它可以被填充,或者它可能曾经被填充但随后从中删除了所有对象,在这种情况下它不会是,nil但它是count会的0.NSOutlineView并不关心childrennil-所有它想知道的是,它需要多少行显示itemchildren.

因此,0如果children是这样的话,在这种情况下返回是完全合理的nil.调用该函数的唯一原因是确定NSOutlineView需要多少行.它不关心答案是0因为children是零还是因为它是空的.

return (children?.count ?? 0)会做我需要的.如果childrennil则返回0.否则它会返回count.完善!


Gab*_*lla 6

这看起来更简单.

Objective-C代码更短,因为nil它也是0的形式,是一种基于C的语言.

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


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

var myArray: Array<String> = []

func numberOfObjectsInMyArray() -> Int {
   return myArray.count
}
Run Code Online (Sandbox Code Playgroud)

(此信息的来源)