Как вы выделяете /dealloc небезопасные указатели в Swift?
С Beta 4 у меня был этот код, который работал нормально:
var red, green, blue, alpha: UnsafePointer<CGFloat>
red = UnsafePointer<CGFloat>.alloc(1)
green = UnsafePointer<CGFloat>.alloc(1)
blue = UnsafePointer<CGFloat>.alloc(1)
alpha = UnsafePointer<CGFloat>.alloc(1)
myColor.getRed(red, green: green, blue: blue, alpha: alpha)
CGContextSetRGBStrokeColor(context, red.memory, green.memory, blue.memory, 1)
red.dealloc(1)
green.dealloc(1)
blue.dealloc(1)
alpha.dealloc(1)
Теперь с Beta5 я получаю ошибку "UnsafePointer.Type" не имеет члена с именем "alloc".
Все, что я пытаюсь сделать, это установить цвет штриха CGContext на основе UIColor. Как я должен это делать сейчас? Функция "withUnsafePointers" - это шутка - она дает странные ошибки, и на нее требуется не более трех небезопасных указателей, тогда как я пытаюсь использовать четыре в этом случае.
Ответы
Ответ 1
Это работает, Свифт достаточно умен, чтобы знать, что делать с оператором &
:
let color = UIColor.purpleColor()
var r:CGFloat, g:CGFloat, b:CGFloat, a:CGFloat = 0
color.getRed(&r, green: &g, blue: &b, alpha: &a)
CGContextSetRGBStrokeColor(c, r, g, b, a)
Если вы действительно хотите выделить себя, используйте свой любимый аромат и создайте указатель следующим образом:
let p = UnsafeMutablePointer<CGFloat>(calloc(1, UInt(sizeof(CGFloat))))
// later don't forget to free(p)
Ответ 2
UnsafePointer<T>
больше не имеет члена .alloc
. Вместо этого используйте UnsafeMutablePointer<T>.alloc
. например следующий blankof()
работает как универсальный инициализатор.
func blankof<T>(type:T.Type) -> T {
var ptr = UnsafeMutablePointer<T>.alloc(sizeof(T))
var val = ptr.memory
ptr.destroy()
return val
}
var red = blankof(CGFloat)
var green = blankof(CGFloat)
var blue = blankof(CGFloat)
var alpha = blankof(CGFloat)
color.getRed(&red, green:&green, blue:&blue, alpha:&alpha)
CGContextSetRGBStrokeColor(context, red, green, blue, 1)
// no need to dealloc because they are all structs, not pointers
Ответ 3
Чтобы ответить на вопрос об установке цвета хода с UIColor
, это будет работать:
CGContextSetStrokeColorWithColor(myUIColor.CGColor);
Я делаю это много в моем двумерном коде Quartz на С++.
Ответ 4
С Beta 5 вы можете просто передать свои переменные с префиксом &.
Просто убедитесь, что они инициализированы.
Дополнительная информация о https://developer.apple.com/swift/blog/?id=6
Чтобы использовать одиночные переменные, вы можете просто установить их на нулевое значение
var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
color.getRed(&r, green: &g, blue: &b, alpha: &a)
Чтобы использовать C-массивы, вы просто создаете нормальный массив с ожидаемыми вами индексами
var points:[NSPoint] = [NSPoint(), NSPoint(), NSPoint()] //notice how we set empty NSPoints
self.elementAtIndex(index, associatedPoints: &points)
CGPathAddCurveToPoint(path, nil, points[0].x, points[0].y, points[1].x, points[1].y, points[2].x, points[2].y)