自更新到 Swift 1.2 以来,字典现在给出错误 'not convertible to BooleanLiteralConvertible'

Dictionary now gives error 'not convertible to BooleanLiteralConvertible' since updating to Swift 1.2

我刚刚开始思考 Swift - 然后是 Swift 1.2(破坏了我的工作代码)!

我有一个基于 NSHipster - CGImageSourceCreateThumbnailAtIndex 中的代码示例的函数。

我以前的工作代码是:

import ImageIO

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 = [
                    kCGImageSourceThumbnailMaxPixelSize: maxSize,
                    kCGImageSourceCreateThumbnailFromImageIfAbsent: true
                ]

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

                // do other stuff
            }
        }
    }
}

从 Swift 1.2 开始,编译器提供了两个与 options 字典相关的错误:

  1. 表达式类型不明确,没有更多上下文
  2. '_' 不可转换为 'BooleanLiteralConvertible'(参考 'true' 值)

我尝试了多种方法来专门声明选项字典中的类型(例如 [String : Any][CFString : Any][Any : Any])。虽然这可能会解决一个错误,但它们会引入其他错误。

谁能帮我照亮一下?? 更重要的是,任何人都可以解释一下 Swift 1.2 和字典的变化是什么阻止了它的工作。

来自 Xcode 6.3 发行说明:

The implicit conversions from bridged Objective-C classes (NSString/NSArray/NSDictionary) to their corresponding Swift value types (String/Array/Dictionary) have been removed, making the Swift type system simpler and more predictable.

您遇到的问题是 CFString,例如 kCGImageSourceThumbnailMaxPixelSize。这些不是自动的 转换为 String 了。两种可能的解决方案:

let options = [
    kCGImageSourceThumbnailMaxPixelSize as String : maxSize,
    kCGImageSourceCreateThumbnailFromImageIfAbsent as String : true
]

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