Nano Hash - криптовалюты, майнинг, программирование

Почему UIKit не нравятся опции Swift 3?

Следующий код Swift 3 дает сбой. Сбой можно легко решить, либо удалив явный необязательный тип, либо принудительно развернув view. Кто-нибудь может объяснить, почему этот код дает сбой?

let view: UIView? = UIView() // note the explicit *optional* type
_ = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0.0, constant: 44.0)

примечание: он не будет компилироваться в Swift 2.3 или более ранней версии

25.08.2016

  • Этот код не дает сбоев. Он не будет компилироваться. 25.08.2016
  • А, я вижу, вы делаете это в Swift 3. В Swift 2 первым параметром был AnyObject (но не AnyObject?, как item2), и он правильно предупредит вас, если вы передадите необязательный параметр. Сейчас Any (а не Any? как item2). Компилятор явно не предупреждает нас о том, что первый параметр не должен быть необязательным. Но он не может быть необязательным, и ему явно не нравится, когда вы пытаетесь передать необязательный. 25.08.2016
  • да, я имел в виду Swift 3 (Xcode 8). добавлено примечание к вопросу 25.08.2016
  • @Rob Знаете ли вы какие-либо документы, которые могли бы объяснить, как на самом деле реализованы необязательные параметры? Раньше я думал, что необязательный параметр — это просто проверка времени компиляции, как __nullable в ObjC, но похоже, что это не так. 25.08.2016
  • @AlexanderVasenin stackoverflow.com/questions/24548475 25.08.2016

Ответы:


1

NSLayoutConstraint(item:, attribute:, relatedBy:, toItem:, attribute:, multiplier:, constant:) имеет параметр item с типом Any:

public convenience init(item view1: Any, attribute attr1: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toItem view2: Any?, attribute attr2: NSLayoutAttribute, multiplier: CGFloat, constant c: CGFloat)

Но из сбоя вы можете понять, что параметр действительно может принимать только UIView или UILayoutGuide:

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «NSLayoutConstraint для необязательного (UIView: 0x7fa0fbd06650; кадр = (0 0; 0 0); слой = CALayer: 0x60800003bb60): Каждый элемент ограничения должен быть экземпляром UIView или UILayoutGuide.'

Компилятор не может проверить тип item во время компиляции. Определено принимать что угодно. Но в деталях реализации, которые нам недоступны, этот метод принимает только необязательные UIView или UILayoutGuide.

Поэтому просто добавьте оператор guard:

let view: UIView? = UIView()
guard let view = view else { // Proceed only if unwrapped
  fatalError()
}
let _ = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0.0, constant: 44.0)
25.08.2016

2

Причина сбоя в том, что UIView и UIView? — это совершенно разные типы. UIView — это класс Objective-C, а UIView? — это перечисление Swift, которое может содержать UIView. Наоборот, в Objective-C nullable — это просто подсказка для компилятора.

25.08.2016
  • Я понял, но как нам остановить сбои по этой причине? 12.12.2016
  • @Steve Вы должны развернуть необязательно, чтобы использовать его с UIKit 12.12.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..