(то есть, если вы согласны, что указатель указывает на временное значение - то есть вы не полагаетесь на то, что значение указателя является стабильным или уникальным, как, например, если бы его использовали, например, как ключ связанного объекта)
ся, что Xcode 9.3 исправляетодна проблема у меня была, но в Swift 4.1 вторая половина этого кода все еще не компилируется:
var obj: SomeClass! ; class SomeClass {}
func inoutFunc(_: inout SomeClass?) {}
inoutFunc(&obj) // works
func pointerFunc(_: UnsafeMutablePointer<SomeClass?>) {}
pointerFunc(&obj) // <-- COMPILER ERROR
Призыв кinoutFunc
сейчас хорошо, но звонокpointerFunc
по-прежнему выдает ошибку:
Невозможно вызвать 'pointerFunc' со списком аргументов типа '(inout SomeClass!)'
Или в оригинальном контексте:
Не удается передать неизменное значение типа 'ActualClass?' в качестве аргумента
Похоже на мою проблему Swift 4.0 (гдеinoutFunc
тоже не компилировался) если я изменю объявление наvar obj: SomeClass?
затем второй вызов функции компилируется без жалоб.
Является ли это еще одной давней ошибкой Swift, связанной с неявно развернутыми опциями, илиUnsafeMutablePointer
Ситуация не должна работать какinout
версия сейчас делает? Есть ли относительно чистый обходной путь?
Фон:
В фактическом кодеpointerFunc
call - это каркасная функция Apple, которая либо инициализирует экземпляр, либо возвращает состояние ошибки.
Так как я ужеguard AppleFrameworkInitializer(&obj) == noErr else { /* … */ }
Я не хочу иметь дело с переназначением из временного необязательного, или приходится постоянно разворачиватьobj!
во всем коде, который следует.
То есть, это похоже на законный вариант использования для неявно развернутых опций, и мне интересно, почему я до сих пор не могу использовать его здесь.