Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 创建一种更简洁的方法来设置具有多个init的结构?_Ios_Swift_Struct - Fatal编程技术网

Ios 创建一种更简洁的方法来设置具有多个init的结构?

Ios 创建一种更简洁的方法来设置具有多个init的结构?,ios,swift,struct,Ios,Swift,Struct,我目前有一个结构,它有多种初始化方法。目前它可以工作,我只是想知道是否有一种更干净的方法来创建结构?这是: struct Destination { var name: String? = "Unkown" var waypoint: JMapWaypoint? init(destination: JMapDestination) { self.name = destination.name self.waypoint = des

我目前有一个结构,它有多种初始化方法。目前它可以工作,我只是想知道是否有一种更干净的方法来创建结构?这是:

    struct Destination {
    var name: String? = "Unkown"
    var waypoint: JMapWaypoint?

    init(destination: JMapDestination) {
        self.name = destination.name
        self.waypoint = destination.waypoints?.first
    }


    init (waypoint: JMapWaypoint) {
        self.waypoint = waypoint
        self.name = "Shared Location"

    }


    init(point: CGPoint, name: String, mapController: JMapController){
        self.name = name
        let pointToJMapPoint = JMapPoint.init(x: Float(point.x),
                                                  y: Float(point.y),
                                                  z: Float(mapController.userLocation.mapId))


        self.waypoint = mapController.getNearestWaypoint(with: pointToJMapPoint ?? JMapPoint())
    }
}
我不知道你对清洁剂的理解是什么。有很多方法可以减少代码中的初始化。您可以给它们一个默认值,例如,或创建其他一些名为DestinationParams的结构,该结构将包含您需要的所有参数

struct Destination {
    private (set) var name: String
    private (set) var waypoint: JMapWaypoint?

    init(destination: JMapDestination? = nil) {
        self.init(name: destination?.name ?? "Shared Location",
                  waypoint: destination?.waypoints?.first)
    }

    init(name: String, point: JMapPoint? = JMapPoint(), mapController: JMapController) {
        let waypoint = mapController.getNearestWaypoint(with: point)
        self.init(name: name,
                  waypoint: waypoint)
    }

    private init(name: String, waypoint: JMapWaypoint?) {
        self.waypoint = waypoint
        self.name = name
    }
}
或者,您可以通过将所有计算移到init之外进行修改,如下所示:

...
let pointToJMapPoint = JMapPoint.init(x: Float(point.x),
                                      y: Float(point.y),
                                      z: Float(mapController.userLocation.mapId))
let point = mapController.getNearestWaypoint(with: pointToJMapPoint ?? JMapPoint())
let x = Destination(name: "Some name", waypoint: point)
...
struct Destination {
    private (set) var name: String
    private (set) var waypoint: JMapWaypoint?

    init(destination: JMapDestination? = nil) {
        self.init(name: destination?.name ?? "Shared Location",
                  waypoint: destination?.waypoints?.first)
    }

    init(name: String, waypoint: JMapWaypoint?) {
        self.waypoint = waypoint
        self.name = name
    }
}

这完全取决于您自己,取决于您想要什么。

对于最后一个,您可以创建一个目的地并将其传递给initdestination:。顺便问一下,currentDestination和currentMapController是结构还是类的名称?在这种情况下,它们应该大写。什么是mapController?您从哪里获取它?@IchBinStudenten哎呀,它不是mapController,它的positionController.currentDestination和mapPoint是类型名称?他们应该是上骆驼案。未知是一个错误的责任。一个未命名的目的地不能发明自己的名字。我要做的一个更改是:将初始化器调用转发到一个中心init,这样就有了一个中心位置来拦截初始化