Arrays Swift:可选数组计数
在Objective-C中,如果我具有以下属性: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&
@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的选择,但对于遗留代码,这是另一回事。