2015-09-24 17 views
20

Qui è una questione di divertimento che sto funzionando in dopo l'aggiornamento a Swift 2.0Initializer per legame condizionale deve avere tipo opzionale, non e 'String'

L'errore è sulla url = linea, se lasciate 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 
} 
+0

Hai cercato la documentazione per il metodo 'absoluteString'? Restituisce un optional ?? –

+0

Ho appena controllato. No, non restituisce un optional, ma 'relativeString' è – mosaic6

risposta

32

Il compilatore vi sta dicendo che non è possibile utilizzare un if let perché è del tutto inutile. Non hai nessun optional da scartare: URL non è opzionale e la proprietà absoluteString non è opzionale. if let è utilizzato esclusivamente per scartare gli optionals. Se si desidera creare una nuova costante di nome url, basta farlo:

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 
} 

Tuttavia, nota a margine: avere un parametro denominato URL e una costante locale chiamato url è potente fonte di confusione. Potresti star meglio in questo modo:

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

possiamo usare la guardia qui? –

+0

@ iPhone6 ​​No, per lo stesso motivo non è possibile usare 'se let': perché' URL.absoluteString' * sempre * ha esito positivo. Non c'è nulla contro cui difendersi - 'absoluteString' è non opzionale e non sarà mai "nulla". – andyvn22

0

absoluteString non è un valore opzionale, è solo una stringa. È possibile verificare se la variabile URL è nullo

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

' URL: NSURL' non è un optional, non può essere nullo. –

+0

Questo deve essere al di fuori della sua funzione textView, modificherà per chiarezza –

2

Ecco la funzione di lavoro:

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 
} 

Nel tuo argomento di funzione rendere il vostro URL opzionale.

E scartare in questo modo:

if let url = URL?.absoluteString { 

    //your code. 
} 
+0

Perché dichiarare "URL" come facoltativo? Secondo https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextViewDelegate_Protocol/, non lo è. –