1

我正在尝试将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 的翻译是正确的还是我遗漏了什么?

4

1 回答 1

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?)在正则括号中使用 来表示 and 的元组,与TypeScript的表示法相匹配 。另请注意,在 TypeScript 和 Swift 实现中,参数都是不可为空的类型,因此无需检查/ 。KeyJsonValue?[Key, JsonValue | null]propertiesnullnil

使用保护子句并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)];
  }); 
}
于 2021-11-02T03:52:40.053 回答