Инициализатор для условной привязки должен иметь тип Optional, а не String.

Вот забавная проблема, с которой я столкнулся после обновления до Swift 2.0

Ошибка находится в строке if let url = URL.absoluteString

func myFormatCompanyMessageText(attributedString: NSMutableAttributedString) -> NSMutableAttributedString
{
    // Define text font
    attributedString.addAttribute(NSFontAttributeName, value: UIFont(name: "Montserrat-Light", size: 17)!, range: NSMakeRange(0, attributedString.length))

    return attributedString
}

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
    if let url = URL.absoluteString {
        if #available(iOS 8.0, *) {
            VPMainViewController.showCompanyMessageWebView(url)
        }
    }
    return false
}

person mosaic6    schedule 24.09.2015    source источник
comment
Вы искали документацию по методу absoluteString? Возвращает ли он необязательный ??   -  person Martin R    schedule 24.09.2015
comment
Просто посмотрел. Нет, он не возвращает необязательный параметр, но relativeString является   -  person mosaic6    schedule 24.09.2015


Ответы (2)


Компилятор сообщает вам, что вы не можете использовать if let, потому что это совершенно не нужно. У вас нет дополнительных опций для разворачивания: URL не является обязательным, и свойство absoluteString также не является обязательным. if let используется исключительно для разворачивания опций. Если вы хотите создать новую константу с именем url, просто сделайте это:

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
    let url = URL.absoluteString
    if #available(iOS 8.0, *) {
        VPMainViewController.showCompanyMessageWebView(url)
    }
    return false
}

Однако примечание: наличие параметра с именем URL и локальной константы с именем url сильно сбивает с толку. Возможно, вам будет лучше так:

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
    if #available(iOS 8.0, *) {
        VPMainViewController.showCompanyMessageWebView(URL.absoluteString)
    }
    return false
}
person andyvn22    schedule 24.09.2015
comment
мы можем здесь использовать охрану? - person iPhone 7; 31.08.2017
comment
@ iPhone6 ​​Нет, по той же причине вы не можете использовать if let: потому что URL.absoluteString всегда успешно. Не от чего защищаться --_ 3_ не является обязательным и никогда не будет nil. - person andyvn22; 31.08.2017

absoluteString не является необязательным значением, это просто строка. Вы можете проверить, равна ли переменная URL нулю

if let url = yourURLVariable {
    // do your textView function
} else {
    // handle nil url
}
person Chris Slowik    schedule 24.09.2015
comment
URL: NSURL не является необязательным, он не может быть нулевым. - person Martin R; 24.09.2015
comment
Это должно быть за пределами его функции textView, для ясности отредактирую - person Chris Slowik; 24.09.2015