Словарь теперь выдает ошибку «не конвертируется в BooleanLiteralConvertible» после обновления до 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 и словарях, которые помешали этому работать.


person So Over It    schedule 26.04.2015    source источник


Ответы (1)


Из примечаний к выпуску Xcode 6.3:

Неявные преобразования из мостовых классов Objective-C (NSString/NSArray/NSDictionary) в соответствующие типы значений Swift (String/Array/Dictionary) были удалены, что сделало систему типов Swift более простой и предсказуемой.

Проблема в вашем случае - это CFString, такие как kCGImageSourceThumbnailMaxPixelSize. Они больше не конвертируются автоматически в String. Два возможных решения:

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

or

let options : [NSString : AnyObject ] = [
    kCGImageSourceThumbnailMaxPixelSize:  maxSize,
    kCGImageSourceCreateThumbnailFromImageIfAbsent: true
]
person Martin R    schedule 26.04.2015
comment
Хорошо, это имеет смысл. По крайней мере, я могу «отчасти» понять, почему он больше не работает. Решение as String, кажется, помогает в моих первоначальных тестах. Спасибо @Martin-R - person So Over It; 26.04.2015