2015-05-08 30 views
4

我正在使用Xcode 6.3.1和Swift。Swift:获取关于函数参数类型错误的更多详细信息

当一个带有多个参数的函数在参数类型上出现错误时,很难知道哪个参数是错误的。

例如,CGBitmapContextCreate(),此代码:

let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB() 
let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue) 
let context = CGBitmapContextCreate(nil, UInt(size.width), UInt(size.height), 8, 0, colorSpace, bitmapInfo) 

会产生这样的错误:

MyFile.swift:23:19: Cannot invoke 'CGBitmapContextCreate' with an argument list of type '(nil, UInt, UInt, Int, Int, CGColorSpace, CGBitmapInfo)' 

通过仔细对比文件和我的参数列表,我可以找到它是第二和第三个参数,它们应该是Int。

有什么办法让编译器更聪明吗?

回答

2

问题可能是您正在寻找的CGBitmapContextCreate的在线文档根据您在编译时实际访问的定义而错误。

最后一个参数需要是UInt32类型,而CGBitmapInfo正在返回一个CGBitmapInfo对象。这就是编译器犯错的原因。您正在传入错误的参数类型。你甚至可以右键点击该功能并点击“查看定义”,这将验证我在说什么。

尝试改为直接传入CGImageAlphaInfo.PremultipliedLast.rawValue,因为它是要查找的UInt32。

解决方案示例:

let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB() 
let bitmapInfo = CGImageAlphaInfo.PremultipliedLast.rawValue 
let context = CGBitmapContextCreate(nil, UInt(size.width), UInt(size.height), 8, 0, colorSpace, bitmapInfo) 

你会发现,你将能够编译源代码,并获得预期的结果。请注意,您仍然可以对此值应用任何按位操作。 PS:我遇到了同样的问题,当我找不到解决方案时,我感到非常沮丧。

0

它的工作原理!

let width = CGImageGetWidth(image) 
    let height = CGImageGetHeight(image) 
    let colorSpace = CGColorSpaceCreateDeviceRGB() 
    let bytesPerRow = 4 * width; 
    let bitsPerComponent :Int = 8 
    let pixels = UnsafeMutablePointer<UInt8>(malloc(width*height*4)) 
    var context = CGBitmapContextCreate(pixels, width, height, bitsPerComponent, bytesPerRow, colorSpace, CGBitmapInfo()) 
+0

除非您稍后释放像素,否则会泄漏缓冲区。它也没有与OP代码相同的功能(它以不同的方式处理Alpha通道)。 –

+0

@RobNapier,嗯..你说得对。 – vkalit

相关问题