2015-09-24 18 views
20

Dưới đây là một vấn đề vui vẻ Tôi đang chạy vào sau khi cập nhật lên Swift 2.0Initializer cho có điều kiện ràng buộc phải có loại bắt buộc, không phải là 'String'

Lỗi này là trên nếu chúng ta hãy url = dòng 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

Bạn đã tra cứu tài liệu cho phương pháp 'absoluteString' chưa? Nó có trả về một tùy chọn không ?? –

+0

Chỉ cần nhìn nó lên. Không có nó không trả về tùy chọn, nhưng 'relativeString' là URL – mosaic6

Trả lời

32

Trình biên dịch được thông báo rằng bạn không thể sử dụng một if let bởi vì nó hoàn toàn không cần thiết. Bạn không có bất kỳ tùy chọn để unwrap: URL không phải là tùy chọn và thuộc tính absoluteString cũng không bắt buộc. if let được sử dụng độc quyền cho các tùy chọn không mong muốn. Nếu bạn muốn tạo một hằng số mới có tên url, chỉ làm điều đó:

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 
} 

Tuy nhiên, sidenote: có một tham số có tên URL và một hằng số địa phương đặt tên là url hùng mạnh khó hiểu. Bạn có thể tốt hơn như sau:

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

chúng ta có thể sử dụng bảo vệ ở đây không? –

+0

@ iPhone6 ​​Không, vì lý do tương tự bạn không thể sử dụng 'if let': vì' URL.absoluteString' * luôn * thành công. Không có gì để bảo vệ - 'absoluteString' là không bắt buộc và sẽ không bao giờ là 'nil'. – andyvn22

0

absoluteString không phải là giá trị tùy chọn, chỉ là một chuỗi. Bạn có thể kiểm tra xem biến URL là con số không

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

': NSURL' không phải là tùy chọn, nó không thể là số không. –

+0

Điều đó có nghĩa là ở bên ngoài chức năng textView của mình, sẽ chỉnh sửa cho rõ ràng –

2

Đây là chức năng làm việc của bạn:

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 
} 

Trong lập luận chức năng của bạn làm cho bạn URL tùy chọn.

Và Unwrap nó theo cách này:

if let url = URL?.absoluteString { 

    //your code. 
} 
+0

Tại sao phải khai báo 'URL' làm tùy chọn? Theo https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextViewDelegate_Protocol/, nó không phải là. –

Các vấn đề liên quan