быстрое опциональное сцепление - может ли оно потерпеть неудачу? - PullRequest
0 голосов
/ 16 апреля 2019

При запуске следующий код:

a?.b?.doSomething()

что произойдет, если a или b равны нулю? это потерпит неудачу? или просто продолжить выполнение следующего кода?

это то же самое, что и следующий код C -

if (a && a.b)
   doSomething()
else
  // do nothing, without failing, nor throwing exception

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

В основном необязательные цепочки используются для предотвращения сбоя в приложении. Здесь, если вы используете? он проверит, является ли конкретный объект нулем или нет, и если он равен нулю, он просто не выполнит метод. В случае, если вы не используете опционально и пытаетесь выполнить метод для объекта nil, это приведет к падению приложения. Так что здесь, если и только если объекты a и b отличны от nil, doSomething () будет выполняться.

1 голос
/ 16 апреля 2019

Также обратите внимание, что:

struct A {
    let b: Int? = nil
    func doSomething() { print("Doing Something") }
    func doSomethingElse() { print("Doing Something Else") }
}
let a = A()
if (a && a.b) {
    a.doSomething()
} else {
    a.doSomethingElse()
}

не скомпилируется. Компилятор говорит вам:

Невозможно преобразовать значение типа «А» в ожидаемое значение «Bool»

В Swift, в отличие, например, от C, условные выражения требуют логических аргументов. ни «a» или «a.b» - логическое значение.

Если вы измените пример на:


if (a != nil && a.b != nil) {
    a.doSomething()
} else {
    a.doSomethingElse()
}

компилируется с предупреждением:

Сравнение необязательного значения типа 'A' с 'nil' всегда возвращает true

Я не сделал «а» необязательным, просто чтобы все было разумно. Если вы сделаете «a» необязательным, вы получите множество ошибок компиляции, сообщающих, что его необходимо развернуть.

Также: прочитайте раздел «охрана».

IMO, дополнительные функции являются полезной и легко используемой функцией Swift.

Детская площадка и руководство ваши друзья.

1 голос
/ 16 апреля 2019

b - ноль, ничего не распечатано:

import Foundation

struct ASample {
    var b:BSample? = nil
}

struct BSample {
    func doSomething(){
        print("Hey")
    }
}

let a: ASample? = ASample()

a?.b?.doSomething()
#

b не ноль, "Эй" распечатывается:

import Foundation

struct ASample {
    var b:BSample? = BSample()
}

struct BSample {
    func doSomething(){
        print("Hey")
    }
}

let a: ASample? = ASample()

a?.b?.doSomething()
#Hey

То же относится и к a. Если a равно nil, выполнение не будет продолжено.

Вы можете попробовать его в http://online.swiftplayground.run/ (PS: при попытке опустить # или #Hey, поскольку они только показывают вам, что будет напечатано в консоли) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...