Небольшой вопрос о дополнительном сцеплении в Swift - PullRequest
1 голос
/ 06 марта 2020

Я запускаю эти коды на игровой площадке, но получаю ошибку компиляции с

a.b.b = 3

, но она хорошо работает на следующей строке. В чем разница между этими двумя? Когда я должен использовать '!' явно, а когда это не нужно?

Вот коды:

class A {
    var a = 1
    var b = B()
}

class B {
    var b = 2
}

var a:A! = A()

a.b.b = 3 // will get a compile error
print(a.b.b) // runs well, print 2
a?.b.b = 3 // runs well
print(a.b.b) // runs well, print 3

1 Ответ

3 голосов
/ 06 марта 2020

Добро пожаловать в Stackoverflow. Давайте попробуем ответить на ваши вопросы один за другим.

В чем разница между этими двумя? a.b.b = 3 и print(a.b.b)

Если это то, что вы имеете в виду, то первое вызывает ошибку на игровой площадке,

выражение не удалось проанализировать, неизвестная ошибка

тогда на самом деле нет никакой разницы. Но если вы хотите знать, почему это происходит, это должно быть проблема игровой площадки. Потому что это выражение не должно вызывать ошибку времени компиляции в Xcode (проект).

Чтобы решить это в Playground, вам нужно разбить выражение, например:

let bOfA = a.b
bOfA.b = 3

Вуаля! Проблема решена!

Кроме того, эта проблема может быть как-то связана с ошибкой XCode:

Компилятор не может проверить это выражение в разумные сроки; попробуйте разбить выражение на отдельные подвыражения


Когда мне следует использовать '!' явно, а когда это не нужно?

Вы используете это !, если вы уверены , что ваш объект имеет значение. ! автоматически разворачивает объект, не проверяя, является ли он нулем или нет.

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

  1. Swift безопасно разворачивает оптические струны и вставки
  2. https://learnappmaking.com/swift-optionals-how-to/
  3. https://forums.developer.apple.com/thread/45469
...