#swift
#swift
Вопрос:
Простите меня, если название сбивает с толку или это глупо, но я немного смущен этим
var logInUser : User!
Это код logInUser
, который является свойством и User
является классом модели, теперь меня смущает то, что это свойство, наследующее класс модели, или это что-то еще, и почему мы его принудительно разворачиваем?
Теперь благодаря этому LogInUser
мы можем получить доступ ко всем свойствам User
класса модели
Комментарии:
1. Прочитайте руководство по программированию Swift: основы . Примерно на 3/4 пути вниз по странице вы найдете раздел о неявно развернутых опциях.
Ответ №1:
В строке, которую вы опубликовали выше, говорится, что ваш тип имеет свойство called logInUser
. Свойство имеет тип User
. Поэтому, если вы получите доступ к этому свойству, у вас будет объект типа User
и вы сможете работать с ним как таковой. Если, например, у вашего User
типа есть свойство с именем firstName
, вы можете получить доступ к этому свойству, сказав var userFirstName = logInUser.firstName
, например.
Точка объяснения (!) означает, что ваша logInUser
переменная является неявно развернутой необязательной. Это означает, что вы говорите компилятору «эта переменная, хотя и необязательная, ВСЕГДА должна быть принудительно развернута при обращении». Несмотря на то, что свойство является необязательным, вам не нужно будет использовать привязку if / let или принудительное разворачивание для доступа к нему. Если вы получите доступ к свойству, а оно равно нулю, вы получите сбой во время выполнения.
Ответ №2:
1) В этом утверждении нет наследования, то, что происходит, просто:
Модель — это представление реальных / воображаемых вещей в битовом мире простыми способами. Это означает, что модель «User» представляет пользователя приложения и содержит все необходимое для выполнения этого представления.
Например, то, что пользователь должен однозначно распознавать, например, по системному адресу электронной почты / имени пользователя или обоим. Очевидно, что модель может содержать что-либо полезное, например, чтобы сделать заказ, модель должна содержать даже адрес.
Теперь важно то, что модель — это просто модель, и это означает, что вы можете использовать эту модель для буквального создания пользователей в вашей системе / приложении.
Чтобы написать что-то вроде
var loginUser: User
Возможно, в случае приложения iOS в контроллере представления это означает, что контроллер должен знать, кто является пользователем, использующим приложение.
Итак, loginUser
это переменная, представляющая экземпляр User
model , что означает, что loginUser
это-a User
, а не его наследование.
Более технически, в вашем случае, если ваш User
класс (модель) содержит, например, свойство email
, вы можете получить доступ к этому электронному письму, введя logInUser.email
и сделав что-то вроде его отображения или использования для аутентификации и так далее.
Обратите внимание, что я использовал работу
class
, которая на самом деле является моделью, в то времяlogInUser
как является объектом, который является экземпляром класса, то есть конкретизацией класса. Это означает, что у вас может быть несколько объектов одного и того же класса, представляющих разных пользователей, например:var adminUser: User, var customerUser: User, var loggedInUser: User
которые являются разными пользователями с разной информацией, и поэтому они являются разными экземплярами одного и того же класса.
проверьте это объяснение объектного программирования
2) Восклицательный знак — это принудительное разворачивание, это означает, что пользователь может или не может существовать, и не требуется его инициализация в init, потому что это может быть nil
(но вы должны присвоить ему допустимое значение, чтобы использовать его), что означает «несуществующий». На самом деле, в обозначении var someV: User?
говорится, что ваша переменная может содержать User
тип или nil
значение.
Разница вашей нотации с !
from
var logInUser: User?
заключается в том, что когда вы используете переменную, если вы объявили ее с !
помощью, вы можете использовать ее, не разворачивая ее:
func someFunction(){
var email = logInUser.email
}
Но это может привести к сбою, если вы не инициализировали свой logInUser
где-нибудь.
Если вы использовали ?
вместо этого, вам нужно развернуть его:
func someFunction(){
var email = logInUser?.email
// OR
var email2 = logInUser!.email
}
Разница в предыдущем использовании logInUser
заключается в том, что logInUser?.email
может возвращаться nil
, при logInUser!.email
попытке принудительно развернуть, и если это не удастся, ваше приложение выйдет из строя.