创建CFDictionary

时间:2015-08-14 06:43:03

标签: swift core-foundation

尝试让以下代码生效:

导入ImageIO

if let imageSource = CGImageSourceCreateWithURL(self.URL, nil) {
    let options: CFDictionary = [
        kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height) / 2.0,
        kCGImageSourceCreateThumbnailFromImageIfAbsent: true
    ]

    let scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options).flatMap { UIImage(CGImage: $0) }
}

我需要知道如何正确初始化CFDictionary。不幸的是,它似乎并不像我预测的那么容易。 我做了一些实验和研究,似乎存在相互矛盾的信息。

对于初学者,这里是关于kCGImageSourceThumbnailMaxPixelSize密钥的Apple文档中的条目:

  

kCGImageSourceThumbnailMaxPixelSize

     

缩略图的最大宽度和高度(以像素为单位)。如果未指定此键,则缩略图的宽度和高度不受限制,缩略图可能与图像本身一样大。如果存在,则此键必须是CFNumber值。可以在传递给函数CGImageSourceCreateThumbnailAtIndex的选项字典中提供此密钥。

在查看如何初始化CFNumber之后,我找到了CFNumber的摘录

  

CFNumber与其可可基金会同行NSNumber进行“免费桥接”。这意味着Core Foundation类型在函数或方法调用中可与桥接的Foundation对象

互换

然后我尝试这样做:

let options: CFDictionary = [
    kCGImageSourceThumbnailMaxPixelSize: NSNumber(double: 3.0)
]

并受到错误消息的欢迎:'_' is not convertible to 'CFString!'Type of expression is ambiguous without more context

1 个答案:

答案 0 :(得分:3)

这是您的工作代码:

func processImage(jpgImagePath: String, thumbSize: CGSize) {

    if let path = NSBundle.mainBundle().pathForResource(jpgImagePath, ofType: "") {
        if let imageURL = NSURL(fileURLWithPath: path) {
            if let imageSource = CGImageSourceCreateWithURL(imageURL, nil) {

                let maxSize = max(thumbSize.width, thumbSize.height) / 2.0

                let options : [NSString : AnyObject] = [
                    kCGImageSourceThumbnailMaxPixelSize:  maxSize,
                    kCGImageSourceCreateThumbnailFromImageIfAbsent: true
                ]

                let scaledImage = UIImage(CGImage: CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options))

                // do other stuff
            }
        }
    }
}

来自文档:

  

来自桥接的Objective-C类的隐式转换   (NSString / NSArray / NSDictionary)给它们对应的Swift值   类型(字符串/数组/字典)已被删除,使得Swift   类型系统更简单,更可预测。

您的案例中的问题是CFStrings,例如kCGImageSourceThumbnailMaxPixelSize。这些不再自动转换为String。

来自HERE的参考。