NSString.sizeWithAttributes() в Swift beta7

Этот фрагмент кода ниже отлично работал в Xcode 6 beta 5:

func fitText(){
    let size = (self.text as NSString).sizeWithAttributes([NSFontAttributeName:self.font]) //Errors here
    self.frame.size = size
}

Теперь он выдает следующие ошибки во второй строке:

«UIFont» не является подтипом «NSDictionary».

Не удается преобразовать тип выражения «$ T6» в тип «UIFont».

Когда я разделил его на

let dict = [NSFontAttributeName:self.font]
let size = (self.text as NSString).sizeWithAttributes(dict) //Even stranger errors go here

xcode говорит:

«UIFont» не является подтипом «NSDictionary».

Не удается преобразовать тип выражения «[NSString: UIFont]» в тип «CGSize».

Что изменилось в Swift в бета-версии 7 или 6, что он ломает код?


person Hristo    schedule 05.09.2014    source источник


Ответы (2)


Несколько сигнатур методов с необязательными и необязательными свойствами были исправлены в бета-версии 7 путем преобразования неявно развернутых необязательных параметров в явные необязательные параметры.

В вашем случае я предполагаю, что свойство text было объявлено как String! (неявно развернутое), тогда как теперь это String?. Таким образом, вы должны развернуть его либо неявно:

let size = self.text!.sizeWithAttributes(dict)

или лучше, используя необязательную привязку:

    if let text = self.text {
        let size = text.sizeWithAttributes(dict)
    }
person Antonio    schedule 05.09.2014
comment
Распаковка заставила его работать. Есть идеи, что это за бредовые сообщения об ошибках? - person Hristo; 05.09.2014
comment
Что ж... быстрые сообщения об ошибках никогда не помогали понять, в чем проблема. Например, бывает, что класс не соответствует протоколу, но он соответствует, или что класс не соответствует определенному свойству и т. д. Я думаю, что по этому вопросу еще много работы, и я надеюсь, что она будет быть исправлено в ближайшее время. - person Antonio; 05.09.2014
comment
Как правило, когда сообщение об ошибке не имеет никакого смысла, это ошибочное использование чего-то другого, но в некоторых случаях речь идет о дополнительных параметрах. Но это также может быть протокол без атрибута @obj, свойства класса, инициализированные ссылками на другие свойства, использование дженериков в мостовых классах и т. д. - person Antonio; 05.09.2014

Ваша функция fitText отлично работает для меня.

Если это поможет, вот несколько вещей, которые я обычно делаю, когда запускаю новую версию Xcode6-beta в первый раз после ее установки:

  1. Дважды проверьте в Xcode > Preferences > Location, что выбраны последние инструменты командной строки.
  2. Удалить папки build и DerivedData
  3. Перезапустите Xcode
  4. Строить
person csch    schedule 05.09.2014