Ошибка при распаковке

Я создал новый оператор, который привязывает значение к цели, только если значение не равно нулю, в противном случае ничего не делает. В основном это синтетический сахар, if let foo = foo { faa = foo } :

 infix operator =? {} func =?<T>(inout lhs: T, rhs: T?) { if let rhs = rhs { lhs = rhs } } func =?<T>(inout lhs: T?, rhs: T?) { if let rhs = rhs { lhs = rhs } } 

Таким образом, я могу сохранить некоторые типизации:

 // instead this: if let x = maybeX { z = x } // I can do this: z =? x 

Моя проблема в том, что когда я добираюсь до строки выполнения ( z =? x ), я сбой даже перед входом в реализацию func с исключением:

 fatal error: unexpectedly found nil while unwrapping an Optional value 

Кажется, Swift пытается заставить распаковать x даже когда реализация принимает T? ,

Есть идеи?

2 Solutions collect form web for “Ошибка при распаковке”

Это оказалось моей ошибкой … Я использовал foo.z = ... где foo был nil UIImageView! … дамм просмотров от nib …

Я бы с радостью изменил свою реализацию с помощью оператора nil coalescing после предложения @RMenke, но насколько я знаю, это приведет к избыточному действию установки z в z, когда x равно nil … например:

 var z = someFoo() var x: Int? = nil z = x ?? z // will this re-write z's reference to z again or simply do nothing? 

@MartinR сделал важный комментарий:

если оператор (или функция) принимает inout-параметр, тогда свойство setter будет вызываться при возврате, даже если вы не назначаете новое значение внутри оператора

Пытаясь решить проблему, я сделал следующее расширение как более чистую версию подхода _ = foo.map... :

 extension Optional { public func use<U>(@noescape f: (Wrapped) throws -> U) rethrows { _ = try self.map(f) } } //then: x.use{ z = $0 } 

Вероятно, это лучше, так как он не вызывает z setter, когда x равен нулю, но является ли это самым чистым / ясным способом?

Ваш оператор работает, но вы должны были использовать целые опции: foo? .z = …

Однако это даст вам еще один вид ошибки, когда foo – это nil, который вы можете исправить, добавив

 func =?<T>(lhs: T??, rhs: T?) -> () {} 

Эта версия «ничего не делает» оператора поглощает неизменяемую версию параметра, которую вы получаете при передаче необязательной цепочки с нулем перед последним членом.

  • NSLocalizedString с переменными Swift
  • myLocationEnabled изменение на isMyLocationEnabled при быстром использовании GoogleMaps
  • enumerateSubstringsInRange в Swift
  • отправлять переменные post в мой Api
  • Извлечь значения RGB из UIColor
  • не удалось выполнить команду: Ошибка сегментации: 11 команда swift frontend завершилась неудачно из-за сигнала (используйте -v для вызова вызова)
  • затухающее видео по быстрой сприките сцены
  • Swift: обновленные IAP-транзакции, не вызываемые.
  • setValueForKeys не работает Swift
  • Как импортировать сторонние фреймворки в Xcode Playground?
  • Как сохранить ячейку заголовка в ячейках таблицы в Swift 2.0
  • Interesting Posts

    UITapGestureRecognizer в SKNode: преобразование координат из UIView в SKNode

    iOS, что использовать для отсортированного списка?

    Загружать форматированный текст из firebase и отображения на IOS

    Как определить предыдущий контроллер представления в стеке навигации

    Как изменить проект Xcode 4 как независимый от машины, например Visual Studio или Eclipse

    Изменение размера UITableView программно

    locationManager: didRangeBeacons: inRegion beacon array содержит несколько экземпляров одного и того же маяка

    Исходное отслеживание местоположения iOS на тестовых устройствах

    Пользовательский переход UIViewController – как и вкладка приложения appstore iOS 11

    Как выполнить кластеризацию на карте google в iOS

    Как Firebase автоматически удаляет значения старше 30 минут

    руководство для UIScrollView и автозапуск

    Навигационная панель мигает черным при выполнении popViewController

    Использование SDK в Google Картах

    Как включить контроллер панели вкладок в рабочий процесс контроллера навигации?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.