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