我有以下代码,假设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>?)'
答案 0 :(得分:1)
与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>?
,最后打开了
可选绑定。