Swift中的cgp回调

Swift中的cgp回调,swift,Swift,我正在尝试将Quartz 2D编程指南(第101页和第102页)中给出的示例信息转换为swift,但在回拨实施过程中遇到错误,如有任何帮助,将不胜感激。这是我的全部代码 override func drawRect(rect: CGRect) { var context = UIGraphicsGetCurrentContext() //Step 1 // refer to function MyDrawStencilStar //Step 2

我正在尝试将Quartz 2D编程指南(第101页和第102页)中给出的示例信息转换为swift,但在回拨实施过程中遇到错误,如有任何帮助,将不胜感激。这是我的全部代码

   override func drawRect(rect: CGRect) {


    var context = UIGraphicsGetCurrentContext()

    //Step 1

  //  refer to function MyDrawStencilStar


   //Step 2

    let baseSpace = CGColorSpaceCreateDeviceRGB()
    let patternSpace = CGColorSpaceCreatePattern(baseSpace)
    CGContextSetFillColorSpace(context, patternSpace)

    //Step 3

    var callback : CGPatternCallbacks = CGPatternCallbacks (version: 0, drawPattern: &MyDrawStencilStar,releaseInfo: nil)
//……我在指向drawPattern的指针上方的行中遇到错误,错误是“(Void,context:CGContextRef)->()”不能转换为“@lvalue inout$T3”

    var pattern =  CGPatternCreate(nil,
        CGRectMake(0, 0, Psize/2, Psize/2),
        CGAffineTransformMake(1, 0, 0, 1, 1, 1),
        Psize/2,
        Psize/2,
        kCGPatternTilingConstantSpacing,
        false,
        &callback)



}




func MyDrawStencilStar (info : Void, context : CGContextRef) {


    var theta : Double = 0.0
    var r : Double = 0.0

    r = 0.8 * Double (Psize) / 2
    theta = 2 * M_PI * 2 / 5  //144 degrees

    CGContextTranslateCTM(context, Psize/2, Psize/2)

    CGContextMoveToPoint(context, 0, CGFloat(r))

    for var k : CGFloat = 0;  k<5; ++k {

        var  x : CGFloat = CGFloat(r) * sin(k * CGFloat(theta))
        var  y : CGFloat = CGFloat(r) * cos(k * CGFloat(theta))


        CGContextAddLineToPoint(context, x,  y)


    }

    CGContextClosePath(context)
    CGContextFillPath(context)

}
var pattern=CGPatternCreate(无,
CGRectMake(0,0,Psize/2,Psize/2),
CGAffineTransformMake(1,0,0,1,1,1),
Psize/2,
Psize/2,
kCGPatternTilingConstantSpacing,
错误的
&(回拨)
}
func MyDrawStencilStar(信息:Void,上下文:CGContextRef){
变量θ:双=0.0
变量r:Double=0.0
r=0.8*双倍(Psize)/2
θ=2*M_π*2/5//144度
CGContextTranslateCm(上下文,Psize/2,Psize/2)
CGContextMoveToPoint(上下文,0,CGFloat(r))

对于var k:CGFloat=0;k这个解决方案是有问题的:

  • 函数“MyDrawStencilStar”应获取UnsafemtablePointer

  • CGPatternCallbacks中注册的指针应为CFunctionPointer)->Void) 这意味着函数指针应该先转换为UnasFemeutablePointer,然后转换为CopaQueepointer,再转换为CFuncfionPointer

  • 尽管如此,我还是在函数调用中遇到了一个异常,有一个更简单的解决方案:

    您正在使用的CoreGraphics API的可能副本使用了C函数指针,Swift不支持。有关更多信息,请参阅副本。查看我的答案