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并不关心children是nil-所有它想知道的是,它需要多少行显示item的children.
因此,0如果children是这样的话,在这种情况下返回是完全合理的nil.调用该函数的唯一原因是确定NSOutlineView需要多少行.它不关心答案是0因为children是零还是因为它是空的.
return (children?.count ?? 0)会做我需要的.如果children是nil则返回0.否则它会返回count.完善!
这看起来更简单.
Objective-C代码更短,因为nil它也是0的形式,是一种基于C的语言.
由于swift是强类型的,所以你没有这样的速记.在这种特殊情况下,它需要更多的努力,但一般来说,它可以节省您因松散打字而导致的大部分麻烦.
关于具体情况,是否有理由首先使阵列成为可选的?你可以只有一个空数组.这样的事可能适合你:
var myArray: Array<String> = []
func numberOfObjectsInMyArray() -> Int {
return myArray.count
}
Run Code Online (Sandbox Code Playgroud)
(此信息的来源)
| 归档时间: |
|
| 查看次数: |
18033 次 |
| 最近记录: |