无法推断出复杂的闭包返回类型

时间:2017-10-03 08:48:42

标签: swift

由于此错误无法构建swift项目。

//显示inputs.flatmap的错误

    fileprivate func makeShippingAddressDictWith(inputs: [TextFieldData]) -> [String: String] {
        var shippingDict: [String: String] = [:]

        let _ = inputs.flatMap { input in
            if let shippingFieldType = input.type as? ShippingDictKeyable.Type {
                shippingDict[shippingFieldType.shippingDictKey] = input.text
            }
            return nil
        }

        // FIXME: these empty values are the result of a poorly designed request in GDKECommerce

        shippingDict["email"] = ""
        shippingDict["second_name"] = ""
        shippingDict["suffix"] = ""
        shippingDict["title"] = ""
        shippingDict["salutation"] = ""
        shippingDict["company_name"] = ""

        return shippingDict
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用.forEach而不是.flatMap。那么你不必担心你无视的返回类型(使用let _ =)。

将此与过滤器相结合可以产生更清晰的功能声明,如果这是您之后的事情:

inputs.map{ ( $0.text, $0.type as? ShippingDictKeyable.Type) }
      .filter{ $1 != nil }
      .forEach{ shippingDict[$1!.shippingDictKey] = $0 }

// FIXME: these empty values are the result of a poorly designed request in GDKECommerce

let blankAttributes = ["email", "second_name", "suffix", "title", "salutation", "company_name"]
blankAttributes.forEach{ shippingDict[$0] = "" }

或者使用Hamish建议的for循环。

如果性能是一个因素,编译器将使用for循环生成比使用map / filter / forEach更快的代码。

请注意,如果你想在功能风格上疯狂,Swift 4会让你在一行中返回整个字典:

return [String:String]( uniqueKeysWithValues:
                        inputs.map{ ($0.type as? ShippingDictKeyable.Type, $0.text) }
                              .filter{ $0.0 != nil }
                              .map{($0!.shippingDictKey,$1)}
                        + ["email", "second_name", "suffix", "title", "salutation", "company_name"]
                          .map{($0,"")}
                      )

这可能只适用于游乐场,但实际项目往往会抱怨表达式过于复杂。