我遇到了类型变量的挑战UnsafeMutablePointer<UInt8>
.
我有这个工作代码来分配并将所有设置为零UInt8
Swift 中的数组。
var bits = UnsafeMutablePointer<UInt8>(calloc(width * height, 8))
问题是我想在不使用 calloc 方法的情况下执行此操作。我有这段代码来分配数组
var bits = UnsafeMutablePointer<UInt8>.alloc(width * height)
但我找不到将所有内存设置为零的方法。
我知道我可以做到这一点,但我认为这不是最好的方法。
for index in 0..< (width * height) {
bits[index] = 0
}
正如@matt建议的,你可以使用initializeFrom
来初始化内存。我会用Repeat
为此的集合类型,因为它避免了任何临时分配:
var bits = UnsafeMutablePointer<UInt8>.alloc(width * height)
bits.initializeFrom(Repeat(count: width * height, repeatedValue: 0))
(注意,不需要将值的类型提供给Repeat
,可以从类型推断出bits
)
如果您发现自己经常这样做,那么可能值得创建一个calloc
类似扩展至UnsafeMutablePointer
:
extension UnsafeMutablePointer {
// version that takes any kind of type for initial value
static func calloc(num: Int, initialValue: T) -> UnsafeMutablePointer<T> {
let ptr = UnsafeMutablePointer<T>.alloc(num)
ptr.initializeFrom(Repeat(count: num, repeatedValue: initialValue))
return ptr
}
// convenience version for integer-literal-creatable types
// that initializes to zero of that type
static func calloc<I: IntegerLiteralConvertible>
(num: Int) -> UnsafeMutablePointer<I> {
return UnsafeMutablePointer<I>.calloc(num, initialValue: 0)
}
}
// creates 100 UInt8s initialized to 0
var bits = UnsafeMutablePointer<UInt8>.calloc(100)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)