Я пытаюсь реализовать собственный оператор для коллекций, аналогичный оператору Элвиса (?: В kotlin, ?? в быстром), но помимо проверки допустимости значения NULL, оператор также проверяет, является ли коллекция ...

2
jXavier 8 Апр 2021 в 23:57

1 ответ

Лучший ответ

Короткий ответ, вы не можете этого сделать. Вероятно ??, предоставляемый swift, работает, потому что у swift есть собственные возможности, и он самостоятельно обрабатывает эти ситуации. Но для нашего кода это не так.

Что там будет:

Для выражения: let value2: String = optionalValue ?/ "default value".

  • Сначала компилятор обратится к параметру optionalValue и найдет 2 метода, которые принимают необязательный в качестве первого параметра;
  • Затем он обратится ко второму параметру (defaultValue), который является замыканием, возвращающим необязательный экземпляр T: Collection, и будет фильтровать и соответствовать первой перегрузке оператора;
  • Последним является возвращаемое значение, которое является необязательным экземпляром T: Collection, и первый метод является совместимым;
  • Успех;

Для выражения: let value4: String? = optionalValue ?/ "default value".

  • Сначала компилятор обратится к параметру optionalValue и найдет 2 метода, которые принимают необязательный в качестве первого параметра;
  • Затем он обратится ко второму параметру (defaultValue), который является замыканием, возвращающим необязательный экземпляр T: Collection, также известный как Optional<T> where T: Collection, а затем найдет 2 варианта для этих 2 параметров;
  • На этом этапе он будет искать тип возвращаемого значения функции, но тоже не удастся;
  • Ошибка компилятора;

Причина сбоя в том, что T: Collection в вашем коде транслируется в String. А для возвращаемого типа defaultValue необязательная строка соответствует первому и второму методам, что приводит к тому, что компилятор не уверен, какой из них следует использовать.

let string: String? = "value" и let string: String? = Optional<String>.init("value") - это то же самое для компилятора из-за неявных преобразований, которые выполняет Swift .

Так что у меня нет способа заставить эту работу работать на том уровне, на котором я сейчас располагаю.

2
Anderson Lucas C. Ramos 8 Апр 2021 в 21:59