Как конвертировать Swift опционально в Objective- C - PullRequest
0 голосов
/ 27 марта 2020

Я ознакомился с опциями Swift, в частности if let, но не могу понять смысл этого кода. Учебник является быстрым проектом, но я пытаюсь использовать его для обновления старого проекта Obj- C. Я не пытаюсь создать опциональное if if в target- c, а просто выясняю, как заставить версию Obj- C делать то, что он делает здесь со Swift. Базовый код не возвращает значение.

if let user = user  << Obj alternative

В соответствии с руководством и вот код:

[[FIRAuth auth] signInWithEmail:userEmail
                   password:userPass
                 completion:^(FIRUser * _Nullable user, NSError * _Nullable error) {
                            if(error == nil) { // No ERROR so already so user already in Firebase
                                if let user = user{
                                    NSDictionary *userData = @{ @"provider": user.providerID};
                                    [[DataService instance] createFirebaseDBUserWithUid:user.uid
                                                                      userData:userData
                                                                      isDriver:NO];
                                }
                                DLog(@"Email user Auth successfully in Firebase");

Вот код createFirebaseDBUserWithUid: user (возможный возвращает идентификатор Firebase значение)

@objc func createFirebaseDBUser(uid: String, userData: Dictionary<String, Any>, isDriver: Bool) {
    if isDriver {
        REF_DRIVERS.child(uid).updateChildValues(userData)
    } else {
        REF_USERS.child(uid).updateChildValues(userData)
    }
}

Будет версия obj- c просто:

if( user != nil ){
    NSDictionary *userData = @{ @"provider": user.providerID};
    [[DataService instance] createFirebaseDBUserWithUid:user.uid userData:userData isDriver:NO];
}

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Уловка с Objective- C, конечно, заключается в его поведении, если вы отправляете какое-либо сообщение для ссылки nil.

Во время его изобретения (1986 г.) это было на самом деле прогресс чтобы любой метод отправлялся на ссылку nil (которая является «ошибочной» в операторе if, поскольку он 0 (число) одновременно) просто возвращает nil (или 0 if вы интерпретируете его как число) и снова «ошибочно».

В этом смысле вы «в основном» правы, если вы делаете

if (user != nil)

в Objective- C везде, где вы видите

if let user = user {
    ...
}

в Свифте. Технически говоря, это не полностью то же самое, так как выражение let даст вам необнуляемую ссылку на то же содержимое, скрывающее необязательный объект для следующей области действия . Таким образом, вам не нужно больше распаковывать объект user в области действия if. Обратите внимание, что пользователь снова будет необязательным после оператора if. Это адекватно отражено в нулевой проверке в Objective- C.

Могут быть «необычные» крайние случаи, которые вы могли бы пропустить, если автор кода Objective- C полагался на «странный» интерпретация метода, передаваемого в Objective- C. В настоящее время полагаться на них считается плохой практикой, но раньше было время, когда у нас были цепочки вызовов методов, основанные на указанном поведении. Свифт был изобретен частично, чтобы избавиться от тех иногда непреднамеренных эффектов в цепочках методов.

0 голосов
/ 28 марта 2020

Objective- C Type эквивалентно Type! в Swift. например: Objective- C NSDictionary будет NSDictionary! в Swift

Таким образом, типы Objective- C являются опциональными по умолчанию, и чтение типа Swift в Objective- C не будет быть необязательным или нет.

вернемся к вашему вопросу, так как цель кода неясна для меня, как правило, код, который вы написали, сгенерирует словарь, который содержит одну пару (ключ, значение) с providerID, которое не связано с тем, чтобы быть необязательным или нет.

проблема, с которой вы столкнетесь, заключается в том, если объект User был создан в Swift, и вы хотите прочитать его в Objective- C, тогда вы настроили это для

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