覆盖 class 和在控制器中声明所有内容之间的区别?

Difference between overriding a class and declaring everything in controller?

各位。我有两种编码方式:

我有一个 mapView,它需要一些变量。我想知道最好的方法是什么?

第一个:

class UGOMapView: MKMapView, MKMapViewDelegate, CLLocationManagerDelegate {

    let regionRadius: CLLocationDistance = 1000 
    var usrLocation: CLLocationManager!
    var annotationView: MKAnnotationView!


    func initUserLocation() {
        if (CLLocationManager.locationServicesEnabled()) {
            usrLocation = CLLocationManager()
            usrLocation.delegate = self
            usrLocation.requestAlwaysAuthorization()
            usrLocation.requestLocation()
        }
    }
}

然后在我的故事板中:

在我的控制器中:@IBOutlet weak var mapView: UGOMapView!

或者:

class MainViewController: UIViewController, MKMapViewDelegate, UITableViewDelegate, UITableViewDataSource, CLLocationManagerDelegate {

    @IBOutlet weak var mapView: MKMapView!
    let regionRadius: CLLocationDistance = 1000 
    var usrLocation: CLLocationManager!
    var annotationView: MKAnnotationView!


    override func viewDidLoad() {
        super.viewDidLoad()
        if (CLLocationManager.locationServicesEnabled()) {
            usrLocation = CLLocationManager()
            usrLocation.delegate = self
            usrLocation.requestAlwaysAuthorization()
            usrLocation.requestLocation()
        }
    }

然后在我的故事板中:

(我的 mapView 中有多个函数。我不知道那里的函数是否有问题?)

你的第一种方法很好。因为,它给了你代码分离和单点修改。如果您为地图视图创建单独的 class,并且假设任何问题都与地图相关,您将非常确定导致问题的代码行将在此 class。另外如果你想处理地图相关的动作,你可以在这里处理它们。另一个好处是 您可以对多个地图视图使用相同的 class。对于视图控制器,您不能对其他地图视图使用相同的代码。

第一种方法第二种方法之间的主要区别是代码重用性

第一种方法总是更好的主意,因为每当您需要使用 class 修改或更改任何内容时,您都可以直接重定向到 class。

在第二种方法中,当您需要添加一些让您感到困惑的更改时,它变得难以管理。

通读这篇文章: https://www.objc.io/issues/13-architecture/subclassing/

您会更清楚什么时候该class 什么时候不该。