gpt4 book ai didi

swift - 在 Swift 中,另一个对象的函数可以转换为不同类型的对象吗?

转载 作者:行者123 更新时间:2023-11-28 15:01:35 25 4
gpt4 key购买 nike

我正在关注 Ray Wenderlich 的 site 上的 MapKit 教程我对几行代码的意思有点困惑。

特别是在评论//4 下,开发人员似乎使用了一个等于 mapView 函数的常量变量,然后将其转换为 MKMarkAnnotationView 类型。

我从未见过这样的事情,但我想在继续之前了解它。我知道函数也是对象,我知道可以将函数放在变量中,但是在这个例子中,开发人员不仅将函数放在变量中,而且开发人员还将其转换为另一种类型,这令人困惑。这行代码能否分解成更小的步骤以帮助我更好地理解它?

开发人员似乎调用了类型为 MKMapView 的 mapView 对象,但可以选择将其转换为 MKMarkerAnnotationView 类型。

//4
if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKMarkerAnnotationView {
dequeuedView.annotation = annotation
view = dequeuedView
}

如果需要,这里是 viewController 的完整代码:

import UIKit
import MapKit

class ViewController: UIViewController {

//created an IBOutlet to control the mapView in interface builder
@IBOutlet weak var mapView: MKMapView!

override func viewDidLoad() {
super.viewDidLoad()

//initial location to zoom the map into once the app is opened.
let initialLocation = CLLocation.init(latitude: 21.282778, longitude: -157.829444)

centerMapOnLocation(location: initialLocation)

mapView.delegate = self

let artwork = Artwork.init(title: "King David Kalakaua", locationName: "Waikiki Gateway Park", discipline: "Sculpture", coordinate: CLLocationCoordinate2D.init(latitude: 21.283921, longitude: -157.831661))

mapView.addAnnotation(artwork)

}

//when specifying a latlong to zoom into in iOS, you must also state a rectangular region for it to display a correct zoom level???
let regionRadius: CLLocationDistance = 1000

func centerMapOnLocation(location: CLLocation){
let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, regionRadius, regionRadius)
mapView.setRegion(coordinateRegion, animated: true)
}

}

extension ViewController: MKMapViewDelegate {

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
//2
guard let annotation = annotation as? Artwork else {
return nil
}
//3
let identifier = "marker"
var view: MKMarkerAnnotationView
//4
if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKMarkerAnnotationView {
dequeuedView.annotation = annotation
view = dequeuedView
} else {
//5
view = MKMarkerAnnotationView.init(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
view.calloutOffset = CGPoint.init(x: -5, y: 5)
view.rightCalloutAccessoryView = UIButton.init(type: .detailDisclosure)
view.markerTintColor = UIColor.green
}
return view
}
}

最佳答案

这是可选的展开。
正如您所注意到的 - 开发人员可选择将函数的结果转换为 MKMarkerAnnotationView。但他也将此与 if let 语法一起使用,这是可选的解包。这意味着这段代码

dequeuedView.annotation = annotation
view = dequeuedView

只有在转换成功时才会执行(即如果转换结果不是nil)。否则这段代码将被忽略。

您也可以使用 guard 语句来做到这一点。例如:

guard let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKMarkerAnnotationView 
else { // code here will be executed if casting fails. In this case you also have to return function }

dequeuedView.annotation = annotation
view = dequeuedView

更多信息 in documentation

关于swift - 在 Swift 中,另一个对象的函数可以转换为不同类型的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48855928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com