2017-10-06 33 views
0

請看看Renderer類的兩個版本。 Renderer1的初始化器成功執行。 Renderer2的初始化程序在對super.init的調用中崩潰。崩潰消息中引用的init(overlay :)初始化器由MKOverlayRenderer聲明,它是類層次結構上的3個層次。爲什麼使用便捷初始化工修復了我的問題?

import UIKit 
import MapKit 

class ViewController: UIViewController { 

    class Renderer1 : MKPolylineRenderer { 

     convenience init(polyline: MKPolyline, lineWidth: CGFloat) { 
      self.init(polyline: polyline) 
      self.lineWidth = lineWidth 
     } 
    } 

    class Renderer2 : MKPolylineRenderer { 

     // Crash Message: 
     // /Users/Robert/Temp/Test/Test/ViewController.swift: 22: 11: fatal error: use of unimplemented initializer 'init(overlay:)' for class 'Test.Renderer2' 
     // 2017-10-06 08:37:10.582531-0400 Test[2962:932545] /Users/Robert/Temp/Test/Test/ViewController.swift: 22: 11: fatal error: use of unimplemented initializer 'init(overlay:)' for class 'Test.Renderer2' 

     init(polyline: MKPolyline, lineWidth: CGFloat) { 
      super.init(polyline: polyline) // <= Crashes Here! 
      self.lineWidth = lineWidth 
     } 
    } 

    private var renderer1: Renderer1? = nil 
    private var renderer2: Renderer2? = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var coordinates = [CLLocationCoordinate2D]() 
     for latitude in 1 ... 10 { 
      coordinates.append(CLLocationCoordinate2D(latitude: CLLocationDegrees(latitude), longitude: 0)) 
     } 

     let polyline = MKPolyline(coordinates: coordinates, count: coordinates.count) 

     renderer1 = Renderer1(polyline: polyline, lineWidth: 10) 

     renderer2 = Renderer2(polyline: polyline, lineWidth: 10) 
    } 
} 

有人請幫我理解這裏發生了什麼嗎?

+0

看起來像一個bug給我; 'MKPolylineRenderer'應該在'super'而不是'self'上調用'init(overlay:)'。因爲你在'Renderer2'中定義了一個指定的初始化器,所以你不會隱式地繼承'init(overlay:)'的實現。 – Hamish

+1

雖然請注意['MKPolylineRenderer'](https://developer.apple.com/documentation/mapkit/mkpolylinerenderer)的文檔說「*您通常使用此類,並且不會繼承它*」。 – Hamish

回答

相關問題