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)
}