2014-06-30 92 views
6

在Objective-C,如果我有以下属性:斯威夫特:可选的阵列数

@property (strong, nonatomic) NSArray * myArray; 

myArray返回一个数字对象的方法将如下所示:

- (NSInteger) numberOfObjectsInMyArray 
{ 
    return [self.myArray count]; 
} 

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

我能想到的在斯威夫特这样做的最好的是等效的:

var myArray: Array<String>? 

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

所以,检查可选的阵列包含一个值,如果是的话解开了数组并返回该值,否则返回0

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

+2

也许返回一个可选的'Int?'? –

+0

可选的'Int'不是必需的,因为在这里的每种情况下都有一个返回值的值。 – holex

+0

'return myArray?.count' ...是的,绝对更短。但是,当然这依赖于在允许可选的地方使用的结果。 'func numberOfSectionsInTableView(tableView:UITableView!) - > Int'例如 –

回答

6

看起来像更简单的方法。

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

由于swift是强类型的,所以你没有这样的简写。在这个特定的情况下,它需要更多的努力,但总的来说,它可以节省大量因松散打字造成的头痛。


关于具体的情况,是否有理由让阵列可选的第一个地方?你可以只有一个空的数组。像这样的东西可能会为你工作:

var myArray: Array<String> = [] 

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

Source for this information

+0

我喜欢它! Swift将确保myArray始终具有价值。万分感谢。 –

+0

,因为零值表示未设置的数组与0数组的数组。 – altagir

3

如何使用optional的返回值?

var myArray: Array<String>? 

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

我认为这种方式更安全。

Source for this information

+0

谢谢@ King-Wizard。 –

25

尝试使用nil coalescing operator

根据苹果文档:

的零合并运算符(一个14 B)解开一个可选的一个,如果它包含一个值,或者b,如果是零返回默认值。

所以你的函数看起来是这样的:

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

我与其他人同意,这可能是多种原因一个坏主意(如使它看起来像有一个算一个数组当没有真正的数组时,“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

因此,如果childrennil,则在这种情况下返回0非常合理。调用函数的唯一原因是确定NSOutlineView需要多少行。它并不在乎答案是否为0,因为children为零或因为它是空的。

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

+0

在这个答案中说明的零合并运算符的使用是OP所述最清洁的问题解决方案(最佳答案)。你可以质疑API的选择,但对于遗留代码,这是一种不同的动物。 –

+0

一个很好的答案,谢谢!如果只有我可以选择2个获胜者...... –