【问题标题】:Initializer for conditional binding must have Optional type, not '[Key : Value?]'条件绑定的初始化程序必须具有 Optional 类型,而不是 '[Key : Value?]'
【发布时间】:2021-11-01 23:51:06
【问题描述】:

我正在尝试将 javascript 翻译成 swift。这是javascript方法:

export function serializeProperty(
      properties: Map<Key, Value | null>,
    ): Array<[Key, JsonValue | null]> {
      const data = Array.from(properties.entries());
      const processedData = data.map(entry => {
        const [key, value] = entry;
        if (value != null) {
          return [key, serializeValue(value)];
        }
        return [key, null];
      });
      return processedData;
    }
export function serializeValue(Value: Value): JsonValue {
  if (Value.type === 'string') {
    return {type: 'string', value: Value.value.toJson()};
  } else if (Value.type === 'array_node') {
    return {
      type: 'array_node',
      value: Value.value.map(node => node.toJson()),
    };
  }
  return Value;
}

我已将其快速翻译如下:

func serializeProperty(properties: [Key: Value?]) -> [[Key: JsonValue?]]? {

  var data: [[Key: JsonValue?]]?

  guard let propertiesJson = properties else { return data }
  for property in propertiesJson {
    for item in property {
      if let unwrappedValue = item.value {
        properties[item.key] = try serializeValue(valueJson: unwrappedValue)
      }
    }
  }

  return data
}

我在这一行遇到错误:guard let propertiesJson = properties else { return data } swift 的翻译是正确的还是我遗漏了什么?

【问题讨论】:

  • 对于翻译,两个 sn-ps 之间的变量名称似乎不匹配
  • 虽然我不了解 Swift,但我在您的翻译中缺少数组、元组或地图类型。
  • serializeValue(在 TypeScript 中)的定义是什么?
  • @msbit 我已经用方法更新了问题
  • 'guard let' 需要一个可选参数(因此出现错误)。您正在尝试将其与具有可选值的非可选字典一起使用。在你的 TypeScript 上,直到你在你的 map 函数中,你才做空检查。顺便说一句,Swift 也有地图。

标签: javascript swift swift-guard


【解决方案1】:

这个 TypeScript 到 Swift 的最简单的翻译如下:

func serializeProperty(properties: Dictionary<Key, Value?>) -> Array<(Key, JsonValue?)> {
  let processedData = properties.map() { key, value -> (Key, JsonValue?) in
    if let value = value {
      return (key, serializeValue(value: value))
    }   

    return (key, nil)
  }
  return processedData
}

注意在正则括号中使用(Key, JsonValue?) 来表示Key 和JsonValue? 中的tuple,与TypeScript 表示法相匹配 [Key, JsonValue | null]。另请注意,在 TypeScript 和 Swift 实现中,properties 参数是不可为空的类型,因此无需检查 null/nil。

使用保护子句并直接返回properties.map()的结果,可以进一步简化为:

func serializeProperty(properties: Dictionary<Key, Value?>) -> Array<(Key, JsonValue?)> {
  return properties.map() { key, value in
    guard let value = value else { return (key, nil) }

    return (key, serializeValue(value: value))
  }
}

反过来说,TypeScript 实现也可以通过类似的方式简化为:

function serializeProperty(properties: Map<Key, Value|null>): Array<[Key, JsonValue|null]> {
  return Array.from(properties.entries()).map(([key, value]) => {
    if (value === null) { return [key, null]; }

    return [key, serializeValue(value)];
  }); 
}

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2021-04-26
    • 2016-01-27
    • 2018-03-05
    相关资源
    最近更新 更多