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

Пожалуйста, помогите, я действительно борюсь с этим, прочитал несколько тем и обсуждений по этому вопросу, но, похоже, не могу найти проблему.Я применил тот же подход, что и другой блок кода в моем приложении.

Я устанавливаю var dictionary со значением при создании экземпляра ViewController из источника ViewController.

Но консоль продолжает выводить строку, обернутую в качестве необязательного и, следовательно, также в пользовательском интерфейсе, почему?

sender.name: Liam, 01/13/1990, Optional("Actor")

Установка dictionary со значением:

var dictionary: [String : Any]!{

    didSet{
        print("inside InviteVC")


        inviteType = dictionary["type"] as? String
        inviteId = dictionary["complimentId"] as? String
        status = dictionary["status"] as? Bool
        timeStamp = dictionary["timeStamp"] as? Int

        sender = dictionary["fromUser"] as? User

        print("sender.name: \(sender!.firstName), \(sender!.birthday), \(String(describing: sender?.occupation))")

    }//end didSet

}//end var

Вот моя модель User:

struct User {

    let uid: String
    let name: String
    let email: String
    let profilePictureURL: String

    var occupation: String?

    let birthday: String
    let firstName: String
    let lastName: String
    let gender: String
    let discoverable: Bool
    let online: Bool

    let discoveryPrefs: [String : Any]

    var profileImages = [String]()

    init(uid: String, dictionary: [String: Any]) {

        self.uid = uid
        self.name = dictionary["name"] as? String ?? ""
        self.email = dictionary["email"] as? String ?? ""
        self.profilePictureURL = dictionary["profilePictureURL"] as? String ?? ""

        self.occupation = dictionary["occupation"] as? String ?? ""

        self.birthday = dictionary["birthday"] as? String ?? ""
        self.firstName = dictionary["firstName"] as? String ?? ""
        self.lastName = dictionary["lastName"] as? String ?? ""
        self.gender = dictionary["gender"] as? String ?? ""
        self.discoverable = dictionary["discoverable"] as? Bool ?? false
        self.online = dictionary["online"] as? Bool ?? false

        self.discoveryPrefs = dictionary["discoveryPrefs"] as? [String : Any] ?? [String : Any]()
        self.profileImages = dictionary["profileImages"] as! [String]


    }//end init

}//end class

И здесь я создаю свой объект User:

func getUserInfo(forUserId forId: String, handler: @escaping (User) -> ()) {

        REF_USERS.child(forId).observeSingleEvent(of: .value, with: { (snapshot) in

            //handle snapshot code here...

            var occupa: String?

            if let occupation = snapshot.childSnapshot(forPath: "occupation").value as? String {
                occupa = occupation
            } else {
                occupa = ""
            }



            let dictionary: [String : Any] = ["uid": uid, "name": name, "email": email, "profilePictureURL": profilePictureURL, "birthday": birthday, "firstName": firstName, "lastName": lastName, "gender": gender, "discoverable": discoverable, "online": online, "discoveryPrefs": discoveryPrefs, "profileImages": profileImages!, "occupation": occupa!]

            let user = User(uid: uid, dictionary: dictionary)

            handler(user)
        }, withCancel: { (error) in
            print(error)
        })


    }//end func

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Если вы посмотрите на строку, в которой вы печатаете значения, вы заметите, что пытаетесь напечатать значение необязательного значения.

print("sender.name: \(sender!.firstName), \(sender!.birthday), \(String(describing: sender?.occupation))")

В последней части у вас есть* разверните sender, который по-прежнему является необязательным, а переменная атрибута occupation также является необязательной.Заменить последнюю часть на

print(sender?.occupation ?? "")

или

if let occupation = sender?.occupation {
    print(occupation)
}
0 голосов
/ 16 октября 2018

Потому что ваш var occupation: String? является необязательным.String(describing:object) совпадает с "\(object)", если объект типа Optional, текст будет заключен в Optional().Вы должны развернуть его, чтобы избавиться от него.

...