Проблема в том, что currentAnnotation.subtitle
- это String??
, поскольку subtitle
- это не только само по себе String?
, но и необязательное свойство протокола MKAnnotation
.Таким образом, простая развертка только подтверждает, что был реализован необязательный протокол subtitle
, но не то, что полученный String?
не был nil
.Вы должны развернуть это тоже.
Но вы можете сделать guard var stringToURL = view.annotation?.subtitle as? String else { ... }
, и он будет правильно развернут в String
:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
let backupURL = URL(string: "https://www.google.com”)!
guard var stringToURL = view.annotation?.subtitle as? String else {
UIApplication.shared.open(backupURL)
return
}
if stringToURL.isValidURL {
stringToURL = stringToURL.prependHTTPifNeeded()
let url = URL(string: stringToURL) ?? backupURL
UIApplication.shared.open(url)
}
}
Примечание, которое откроет backupURL
, если строка не указана,но если строка была указана и не была действительным URL, она ничего не сделает.Поэтому, возможно, вы имели в виду следующее, которое откроет backupURL
, если не может открыть stringToURL
:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
let backupURL = URL(string: "https://www.google.com")!
guard var stringToURL = view.annotation?.subtitle as? String,
stringToURL.isValidURL else {
UIApplication.shared.open(backupURL)
return
}
stringToURL = stringToURL.prependHTTPifNeeded()
let url = URL(string: stringToURL) ?? backupURL
UIApplication.shared.open(url)
}
Где:
extension String {
var isValidURL: Bool {
let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let range = NSRange(startIndex..., in: self)
return detector.firstMatch(in: self, range: range)?.range == range
}
func prependHTTPifNeeded() -> String{
if prefix(4) != "http" {
return "http://" + self
} else {
return self
}
}
}