web-dev-qa-db-de.com

Der Initialisierer für die bedingte Bindung muss einen optionalen Typ haben, nicht 'String'

Hier ist ein lustiges Thema, auf das ich nach dem Update auf Swift 2.0 stosse

Der Fehler befindet sich in der Zeile 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
}
29
mosaic6

Der Compiler sagt Ihnen, dass Sie keinen if let verwenden können, da er völlig unnötig ist. Sie haben keine Optionale zum Entpacken: URL ist nicht optional und die absoluteString-Eigenschaft ist ebenfalls nicht optional. if let wird ausschließlich zum Entpacken von Optionals verwendet. Wenn Sie eine neue Konstante mit dem Namen url erstellen möchten, tun Sie dies einfach:

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
}

Randbemerkung: Der Parameter URL und die lokale Konstante url sind jedoch verwirrend. Es könnte Ihnen besser gehen:

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

absoluteString ist kein optionaler Wert, sondern nur ein String. Sie können überprüfen, ob die URL-Variable gleich Null ist

if let url = yourURLVariable {
    // do your textView function
} else {
    // handle nil url
}
0
Chris Slowik