Ios 斯威夫特:写这个数组映射的更优雅的方法?
我想知道是否有更优雅的方式来写这封信:Ios 斯威夫特:写这个数组映射的更优雅的方法?,ios,arrays,swift,xcode,Ios,Arrays,Swift,Xcode,我想知道是否有更优雅的方式来写这封信: struct S { var state: [String: Any] public var amounts: [Amount] { var result: [Amount] = [] (self.state["amounts"] as? [Any]?)??.forEach({ a in result.append(Amount(a)) }) ret
struct S {
var state: [String: Any]
public var amounts: [Amount] {
var result: [Amount] = []
(self.state["amounts"] as? [Any]?)??.forEach({ a in
result.append(Amount(a))
})
return result
}
}
struct Amount {
init(_ any: Any?) {}
}
我已尝试使用map for array,但找不到这样做的方法。您在这里使用了太多不必要的选项。您应该始终使用as?使用非可选类型。使用map代替forEach:
struct S {
var state: [String: Any]
public var amounts: [Amount] {
return (self.state["amounts"] as? [Any] ?? []).map({ Amount($0) })
}
}
struct Amount {
init(_ any: Any?) {}
}
你可以在一条线上完成
public var amounts: [Amount] {
return (self.state["amounts"] as? [Any])?.map({ Amount($0) }) ?? []
}
你也可以使用后卫让和提前返回,这将使它看起来更好
我是这样做的
struct S {
var state: [String: Any]
public var amounts: [Amount] {
guard let amounts = state["amounts"] as? [Any] else {
return []
}
return amounts.map(Amount.init)
}
}
金额的值很可能比[Any]更具体,因为金额数组将根据来自state的可选值填充,我建议将其声明为可选数组[Amount]?。我收到一个错误:无法将类型为“Amount”的值转换为关闭结果类型“[Amount]”@Rob replace return为return self。状态为[amounts]as?[任何]??[]map{Amount$0}我同意这一点。与其他答案相比,该方法非常快速且易于理解。您认为mapAmount.init是否比.map{Amount$0}更具可读性?这取决于人与人之间的关系。我假设OP知道基本的swift语法。对我来说,mapAmount.init肯定是可读的,并且比完全闭包的要短。
struct S {
var state: [String: Any]
public var amounts: [Amount] {
guard let amounts = state["amounts"] as? [Any] else {
return []
}
return amounts.map(Amount.init)
}
}
init(_ state: [Amount]) {
self.init()
guard let amounts = state["amounts"] as? [Any] else {
return []
}
return amounts.map(Amount.init)
}