NSFontAttributedString работал до XCode 6.1

let timeFont = [NSFontAttributeName:UIFont(name: "Voyage", size: 20.0)]
var attrString3 = NSAttributedString("(Time)", attributes : timeFont); // <--- compiler error "Extra argument in call"

Этот код работал в xcode 6.0, но теперь, когда я обновился до xcode 6.1, он больше не работает, и я не могу понять, что мне нужно, чтобы он снова заработал. Там написано, что есть лишний аргумент, но это неверно. Я считаю, что это как-то связано с новыми неудачными инициализаторами, но все, что я пробовал, не работает.


person JTerry    schedule 22.10.2014    source источник


Ответы (2)


Xcode 6.1 поставляется со Swift 1.1, который поддерживает конструкторы, которые могут дать сбой. UIFont инициализация может завершиться ошибкой и вернуть nil. Также используйте string: при создании NSAttributedString:

if let font = UIFont(name: "Voyage", size: 20.0) {
    let timeFont = [NSFontAttributeName:font]
    var attrString3 = NSAttributedString(string: "(Time)", attributes : timeFont)
}
person Kirsteins    schedule 22.10.2014

Есть две причины, по которым ваш код не компилируется:

  • Инициализатор для NSAttributedString, который вы хотите использовать, теперь требует явной маркировки параметра string.
  • Инициализатор UIFont, который вы сейчас используете, возвращает необязательное значение (т. е. UIFont?), которое необходимо развернуть перед передачей в словарь атрибутов.

Попробуйте это вместо этого:

let font = UIFont(name: "Voyage", size: 20.0) ?? UIFont.systemFontOfSize(20.0)
let attrs = [NSFontAttributeName : font]
var attrString3 = NSAttributedString(string: "(Time)", attributes: attrs)

Обратите внимание на использование нового оператора объединения ??. Это разворачивает необязательный шрифт Voyage, но возвращается к системному шрифту, если Voyage недоступен (что, похоже, имеет место в Playground). Таким образом, вы получаете свою атрибутированную строку независимо от того, даже если ваш предпочтительный шрифт не может быть загружен.

person Todd Agulnick    schedule 22.10.2014