Arrays Swift:可选数组计数

Arrays Swift:可选数组计数,arrays,swift,optional,Arrays,Swift,Optional,在Objective-C中,如果我具有以下属性: @property (strong, nonatomic) NSArray * myArray; 在myArray中返回多个对象的方法如下所示: - (NSInteger) numberOfObjectsInMyArray { return [self.myArray count]; } 这将返回数组中的对象数,如果myArray==nil,则返回0 在Swift中,我能想到的最好的等效方法是: var myArray: Array&

在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
}
var myArray:Array?
func numberOfObjectsInMyArray()->Int
{
返回myArray?myArray!。计数:0
}
因此,检查可选数组是否包含值,如果是,则展开数组并返回该值,否则返回0


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

看起来更简单

Objective-C代码之所以更短,只是因为
nil
也是0的一种形式,是一种基于C的语言

因为swift是强类型的,所以你没有这样的速记。在这种特殊情况下,它需要更多的努力,但总的来说,它可以为您省去大部分由松散键入引起的头痛


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

var myArray: Array<String> = []

func numberOfObjectsInMyArray() -> Int {
   return myArray.count
}
var myArray:Array=[]
func numberOfObjectsInMyArray()->Int{
返回myArray.count
}

()

使用
可选
作为返回值如何

var myArray: Array<String>?

func numberOfObjectsInMyArray() -> Int? {
    return myArray?.count
}
var myArray:Array?
func numberOfObjectsInMyArray()->Int?{
返回myArray?计数
}
我认为这样比较安全

()

尝试使用

根据苹果的文档:

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

因此,您的函数可以如下所示:

    func numberOfObjectsInMyArray() -> Int {
        return (myArray?.count ?? 0)
    }
我同意其他人的观点,这可能是一个坏主意,原因有很多(比如当实际上根本没有数组时,让它看起来像是有一个计数为“0”的数组),但是,即使是坏主意也需要实现

编辑:

所以我加上这个是因为在我发布这个答案两分钟后,我发现了一个做作者想做的事情的理由

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

可选函数大纲视图(\outlineView:NSOutlineView,
numberOfChildrenOfItem项目:AnyObject?->Int

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

在向数组中实际添加子元素之前,我不会初始化该数组

换句话说,在我向NSOutlineView提供数据时,
子项可以是
nil
,也可以填充,或者它可能曾经被填充过,但随后所有对象都被移除,在这种情况下,它不会是
nil
,但它的
count
将是
0
。NSOutlineView不关心
子项是否为
nil
——它只想知道显示
项的
子项需要多少行

因此,在这种情况下,如果
children
nil
,则返回
0
非常有意义。调用该函数的唯一原因是确定NSOutlineView需要多少行。它不在乎答案是
0
,因为
children
是零还是因为它是空的


return(children?.count±0)
将满足我的需要。如果
children
nil
它将返回
0
。否则它将返回
count
。太好了

可能返回可选的
Int?
?可选的
Int
不是必需的,因为这里的每种情况都有一个值返回值。
return myArray?.count
…是的,肯定更短。当然,这取决于在允许使用可选选项的地方使用的结果。例如,
func numberOfSectionsInTableView(tableView:UITableView!)->Int
中不好,为什么要为nil数组返回0?空数组有0个元素。nil数组不存在。有一个根本性的区别。@ashleyMills,我已经更新了我的答案:有什么理由拥有一个可选数组吗?我喜欢它!Swift将确保myArray始终具有值。很好,谢谢。因为nil值表示尚未设置的数组与计数为0的数组。如OP所述,使用nil合并运算符是解决问题的最干净的方法(最佳答案)。您可以质疑API的选择,但对于遗留代码,这是另一回事。