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,这样就有了一个中心位置来拦截初始化