如果let没有为MKAnnotation的title属性解包可选值

sub*_*dan 0 mkannotation ios swift

我想用if-let语句解包可选值.我需要获得MKAnnotation的标题.

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    if let title = view.annotation?.title {
        print(title) //Optional("Moscow")
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么if-let在这里不起作用?

Dáv*_*tor 5

类型MKAnnotation.titleString??,它是嵌套的Optional,所以你需要可选绑定它两次.

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    if let optionalTitle = view.annotation?.title, let title = optionalTitle {
        print(title)
    }
}
Run Code Online (Sandbox Code Playgroud)

即使根据MKAnnotation.title文档,标题的类型应该是String?,因为title声明为非必需的协议属性:

optional var title: String? { get }
Run Code Online (Sandbox Code Playgroud)

当通过MKAnnotation协议类型访问而不是实现协议的具体类型时,它将被包装在另一个中Optional,这表示该title属性甚至可能不是由实现协议的具体类型实现的.因此,当访问对象的title属性MKAnnotation而不是具有符合的具体类型的对象时MKAnnotation,title将是类型String??.

  • 我只是想知道:可选链接通常会*不*给出嵌套的选项:https://docs.swift.org/swift-book/LanguageGuide/OptionalChaining.html:*"如果您要检索的类型已经是可选的,由于链接,它不会变得更加可选."* (2认同)