我有以下代码,假设 data
类型为NSData?
:
if let myData = data {
let bytes = UnsafePointer<UInt8>(myData.bytes)
...
}
如何将其简化为单个语句,例如:
if let bytes = UnsafePointer<UInt8>?(data?.bytes) {
...
}
上面给出的错误为:Cannot invoke initializer for type 'UnsafePointer<UInt8>?' with an argument list of type '(UnsafePointer<Void>?)'
最佳答案
与 Getting the count of an optional array as a string, or nil 类似,您可以使用map()
方法Optional
:
/// If `self == nil`, returns `nil`. Otherwise, returns `f(self!)`.
@warn_unused_result
@rethrows public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U?
就您而言:
if let bytes = (data?.bytes).map({ UnsafePointer<UInt8>($0) }) {
}
(data?.bytes)
使用可选链并具有类型
UnsafePointer<Void>?
。 map 函数用于转换
至UnsafePointer<UInt8>?
,最后被解开
可选绑定(bind)。
关于swift - 使用 Swift 的可选绑定(bind)直接获取 NSData 的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33209340/