我正在将一个项目从objective-c转换为swift。在其中,有一个NSMutableData对象最初是这样实例化的:

NSMutableData *buffer = [[NSMutableData alloc] initWithLength:65535];

在swift中,当我尝试以同样的方式实例化它时,它会生成一个可选的(并且我正在使用的函数不能与可选的一起工作,所以如果我这样做,它会变得有点混乱,除非我能确定强制打开它是安全的):
let buffer = NSMutableData(length: 65535) // optional

但我可以在两个步骤中完成看起来完全相同的事情,得到一个非可选的:
let buffer = NSMutableData() // not optional
buffer.length = 65535

据我所知,无论哪种方式,我都得到相同的结果,那么为什么只有第一个是可选的呢?有没有什么理由不安全地强行打开它,或有任何不利的做法,以第二种方式?

最佳答案

我猜init(length:)是尝试分配一定数量字节的安全方法,可能会安全地失败并返回nil。但是,如果更改可变数据对象的length属性,malloc失败,则会引发异常。
如果我需要分配大量字节,并且我不确定malloc是否会成功,那么我将使用一个guard语句:

guard let buffer = NSMutableData(length: N) else { return }

关于objective-c - 为什么空的NSMutableData是可选的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44466599/

10-13 09:04