【问题标题】:"Cannot find an initializer for type 'MKPlaceMark' that accepts an argument list of type“找不到接受类型参数列表的 'MKPlaceMark' 类型的初始化程序
【发布时间】:2015-09-18 23:14:36
【问题描述】:

这段代码有两个错误:

“找不到接受类型为'(坐标:CLLocationCoordinate2D,addressDictionary:[NSString:String])'的参数列表的类型'MKPlacemark'的初始化程序

“不能使用类型为'(String, completionHandler: ([AnyObject?]!, NSError?) -> _)'的参数列表调用'geocodeAddressstring'

我尝试在这里和那里放置可选选项,并读到它可能会解决问题,但没有奏效。

我应该对我的代码进行哪些更改以修复这些错误并使我的 ViewController 工作?

import UIKit
import CoreLocation
import AddressBook
import Contacts
import MapKit

class ViewController: UIViewController {

    @IBOutlet weak var address: UITextField!
    @IBOutlet weak var city: UITextField!
    @IBOutlet weak var province: UITextField!
    @IBOutlet weak var zip: UITextField!

    var coords: CLLocationCoordinate2D?

    @IBAction func getDirections(sender: UIButton) {

        let geoCoder = CLGeocoder()

        let addressString = "\(address.text) \(city.text) \(province.text) \(zip.text)"

        geoCoder.geocodeAddressString(addressString, completionHandler: {(placemarks: [AnyObject?]!, error: NSError?) in

            if error != nil {

                print("Geocode failed with error: \(error?.localizedDescription)")

            } else if placemarks?.count > 0 {

                let placemark = placemarks[0] as! CLPlacemark
                let location = placemark.location
                self.coords = location.coordinate

                self.showMap()
            }
        })
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func showMap() {
        let addressDict =[kABPersonAddressStreetKey as NSString: address.text!,
            kABPersonAddressCityKey: city.text!,
            kABPersonAddressStateKey: province.text!,
            kABPersonAddressZIPKey: zip.text! ]

        let place = MKPlacemark(coordinate: coords!, addressDictionary: addressDict)
        let mapItem = MKMapItem(placemark: place)
        let options = [MKLaunchOptionsDirectionsModeDriving]

        mapItem.openInMapsWithLaunchOptions(options)
    }
}

【问题讨论】:

    标签: ios xcode swift mapkit xcode7-beta2


    【解决方案1】:

    你升级到 swift 2.0 了吗?

    Swift 1.2 及之前的版本

    geoCoder.geocodeAddressString(addressString, completionHandler: {(placemarks: [AnyObject?]!, error: NSError?) in
    

    斯威夫特 2.0

    geocoder.geocodeAddressString(addressString, completionHandler: {(placemarks: [CLPlacemark]?, error: NSError?) -> Void in
    

    还有变化

    let placemark = placemarks[0] as! CLPlacemark
    

    let placemark = placemarks[0]
    

    【讨论】:

    • 我确实已经升级到 Swift 2.0 并且目前正在使用 Xcode 7 beta。不过,更改后我仍然遇到错误。在我的“let placemark = ...”行中,出现错误“无法下标 '[CLPlacemark] 类型的值?”带有“Int”类型的索引”。在我的“let place = ...”行(在我的 showMap 函数中)我仍然遇到同样的错误:S
    • 注意:在这篇文章 (stackoverflow.com/questions/30829930/…) 的帮助下,我能够修复“let placemark...”行错误。我应该写'else if let placemark = placemarks?.first {'。仍然没有找到错误的修复方法:“找不到接受类型为 '(coordinate: CLLocationCoordinate2D, addressDictionary: [NSString : String])'的参数列表的类型 'MKPlacemark' 的初始化程序”
    【解决方案2】:

    对于持续的 MKPlacemark 错误,请尝试更改

    let place = MKPlacemark(coordinate: coords!, addressDictionary: addressDict)

    let place = MKPlacemark.init(coordinate: coords!, addressDictionary: (addressDict as! [String:AnyObject]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多