2015-09-24 4 views
20

ist hier ein Spaß Thema, das ich in renne nach Swift Aktualisierung 2.0Initializer für bedingte Bindung muss Optional Typ, nicht ‚String‘

Der Fehler auf dem ist, wenn url = lassen URL.absoluteString Linie

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 
} 
+0

Haben Sie die Dokumentation für die 'absoluteString' Methode nachgeschlagen? Gibt es ein optionales zurück? –

+0

Habe gerade nachgeschaut. Nein es gibt kein optionales zurück, aber 'relativerString' ist – mosaic6

Antwort

32

Der Compiler sagt Ihnen, dass Sie keine if let verwenden können, weil es völlig unnötig ist. Sie müssen keine Optionen zum Entpacken haben: URL ist nicht optional, und die absoluteString-Eigenschaft ist auch nicht optional. if let wird ausschließlich zum Auspacken von Optionen verwendet. Wenn Sie eine neue Konstante url Namen erstellen möchten, tun Sie es 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 
} 

jedoch Bemerkung am Rande: URL und eine lokale Konstante namens url ist mächtig verwirrend einen Parameter mit dem Namen haben. Sie könnten besser so sein:

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

Können wir Wächter hier benutzen? –

+0

@ iPhone6 ​​Nein, aus dem gleichen Grund können Sie 'if let' nicht verwenden: weil' URL.absoluteString' * immer * erfolgreich ist. Es gibt nichts, vor dem Sie sich schützen sollten - "AbsoluteString" ist nicht optional und wird niemals "nil" sein. – andyvn22

0

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

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

' URL: NSURL' ist kein optionales, es kann nicht Nil sein. –

+0

Das soll außerhalb seiner textView Funktion sein, redigiert für Klarheit –

2

hier Ihre Arbeitsfunktion ist:

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 
} 

In Ihrer Funktion Argument Ihre URL optional machen.

Und auszupacken es so aus:

if let url = URL?.absoluteString { 

    //your code. 
} 
+0

Warum erklären 'URL' als wahlweise freigestellt? Laut https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextViewDelegate_Protocol/ ist dies nicht der Fall. –