Инициализатор для условной привязки должен иметь необязательный тип, а не «[Key: Value?]»
Я пытаюсь перевести javascript на быстрый. Это метод 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 }
Правильный ли перевод на быстрый или я что-то упустил?
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?
, что соответствует нотации TypeScript
[Key, JsonValue | null]
. Также обратите внимание, что как в реализациях TypeScript, так и в Swift
properties
параметр является типом, не допускающим значения NULL, поэтому нет необходимости проверять
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)];
});
}