Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Правило:
inout
и принимая адрес, как указал newacct. Но тип сам по себе является типом значений. Объект ссылочного типа является специальным на практике, потому что:
let
, явной или подразумеваемой). Это могут быть опасения, поэтому следите. С другой стороны, передача ссылочного типа явно эффективна, потому что копируется и передается только указатель, который является тривиальным.
Ясно, что передача значения тип «безопаснее», а let
означает, что он говорит: вы не можете мутировать экземпляр структуры или экземпляр enum с помощью ссылки let
. С другой стороны, эта безопасность достигается путем создания отдельной копии значения, не так ли? Разве это не означает, что тип ценности потенциально дорог?
Ну, да и нет. Это не так плохо, как вы думаете. Как сказал Нейт Кук, передача значения типа обязательно подразумевает копирование, потому что let
(явный или подразумеваемый) гарантирует неизменность, поэтому нет необходимости копировать что-либо. И даже переключение в ссылку var
не означает, что вещи будут скопированы , только если они могут быть в случае необходимости (потому что есть мутация). Документы специально советуют вам не заставлять своих трусиков закручиваться.
Вот небольшой пример кода для передачи по ссылке. Избегайте делать это, если у вас нет веских причин.
func ComputeSomeValues(_ value1: inout String, _ value2: inout Int){
value1 = "my great computation 1";
value2 = 123456;
}
Вызвать это так
var val1: String = "";
var val2: Int = -1;
ComputeSomeValues(&val1, &val2);
Все в Swift передается по умолчанию «копировать», поэтому, когда вы передаете тип значения, вы получаете копию значения, а когда вы передаете ссылочный тип, вы получаете копию ссылки, со всем тем, что влечет за собой. (То есть копия ссылки по-прежнему указывает на тот же экземпляр, что и исходная ссылка.)
Я использую цитаты с испугом вокруг «копии» выше, потому что Swift выполняет большую оптимизацию; где это возможно, он не копируется до тех пор, пока не произойдет мутация или вероятность мутации. Поскольку параметры по умолчанию неизменяемы, это означает, что большую часть времени фактически нет копии.
Всегда всегда передается по значению, когда параметр не является inout
.
Всегда всегда передается по ссылке, если параметр inout
. Однако это несколько осложняется тем, что вам необходимо явно использовать оператор &
для аргумента при передаче в параметр inout
, поэтому он может не соответствовать традиционному определению pass-by-reference, где вы передаете переменная напрямую.
inout
)
– Gobe
22 March 2016 в 13:34
inout
на самом деле не проходит по ссылке, но copy-in copy-out i>. Это гарантирует, что после изменения функционального вызова исходный аргумент будет назначен. Параметры входа
– Dalija Prasnikar
13 April 2017 в 19:41
Классы передаются по ссылкам, а другие передаются по значению по умолчанию. Вы можете передать ссылку с помощью ключевого слова inout
.
В блоге разработчика Apple Swift есть сообщение с именем Value и Reference Types , в котором дается четкое и подробное обсуждение этой темы.
Цитируя:
< blockquote>Типы в Swift попадают в одну из двух категорий: во-первых, «типы значений», где каждый экземпляр хранит уникальную копию своих данных, обычно определяемую как структура, перечисление или кортеж. Во-вторых, «ссылочные типы», где экземпляры используют одну копию данных, а тип обычно определяется как класс.
blockquote>Сообщение в блоге Swift продолжает объяснять различия с примерами и предлагает, когда вы будете использовать один над другим.
inout
независимо от типа. Независимо от того, что-то передается по ссылке, ортогонально к типам. – newacct 9 December 2014 в 02:36