3

MKMapItem を作成する関数を迅速に記述しようとしていますが、文字列エラーが発生します。コードは次のとおりです。

func mapItem() -> MKMapItem {
    let addressDictionary = [String(kABPersonAddressStreetKey): subtitle]
    let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary)

    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = title

    return mapItem
}

を作成しようとすると、次のエラーが発生しましたplacemark

型 "[String : String?]" の値を予期される引数型 "[String : AnyObject] に変換できませんか?

完全なクラス コード:

class Bar: NSObject, MKAnnotation {

    // MARK: Properties
    let id: Int
    let title: String
    let locationName: String
    let url: String
    let imageUrl: String
    let tags: String
    let coordinate: CLLocationCoordinate2D

    // MARK: Initialisation
    init(id: Int, adress: String, name: String, url: String, tags: String, imageUrl: String, coordinate: CLLocationCoordinate2D) {
        // Affectation des attributs
        self.id = id
        self.title = name
        self.locationName = adress
        self.url = url
        self.imageUrl = imageUrl
        self.tags = tags
        self.coordinate = coordinate
    }

    // MARK: Subtitle

    var subtitle: String {
        return locationName
    }

    // MARK: Helper

    func mapItem() -> MKMapItem {
        var addressDictionary : [String:String]?
        addressDictionary = [String(kABPersonAddressStreetKey): subtitle]

        let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary)

        let mapItem = MKMapItem(placemark: placemark)
        mapItem.name = title

        return mapItem
    }    
}
4

2 に答える 2

1

サブタイトル プロパティはオプションの String のように見えますが、MKPlacemark初期化子には の型の引数が必要[String : AnyObject]?ですaddressDictionary

どういう意味ですか ?

予想される引数の型は、キーが aStringで値が kindAnyObjectである辞書なので、何でもかまいません。nil 以外の値 ! ただし、subtitleプロパティが nil になる可能性があるため、このエラーが発生します。

使用する前に値をアンラップします:

func mapItem() -> MKMapItem {

    var addressDictionary : [String:String]?

    if let subtitle = subtitle {
        // The subtitle value used here is a String,
        // so addressDictionary conforms to its [String:String] type
        addressDictionary = [String(kABPersonAddressStreetKey): subtitle
    }

    let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: addressDictionary)

    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = title
    return mapItem
}

が nilの場合、オプションのMKMapItemオブジェクトを返すこともできます。subtitle選択はあなた次第です ;)

于 2016-04-18T14:38:33.127 に答える