Как сделать необязательную строку необязательной в Swift

#swift #google-cloud-firestore #google-cloud-functions #stripe-payments #optional

#swift #google-cloud-firestore #google-cloud-функции #stripe-платежи #тип параметра

Вопрос:

Я внедряю Stripe в свое приложение, поэтому, когда я отправляю свой customer_id в качестве параметра в swift, он должен быть необязательным, иначе он не работает. Но я извлекаю идентификатор из firebase как необязательное значение. Есть ли какой-либо способ превратить необязательный идентификатор в необязательную переменную. код для получения идентификатора из firestore:

 docRef.getDocument(source: .cache) { (document, error) in
                                  if let document = document {
                                    id = document.get("id") as? String ?? ""
                                  } 
  

идентификатор возвращается как необязательный. Мне нужно отправить необязательную переменную в качестве идентификатора (это единственный способ, которым это работает):

 var data = ["api_version" : apiVersion, "customer_id" : id]
        
        functions.httpsCallable("getStripeEphemeralKeys").call(data)
  

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

Комментарии:

1. Любая необязательная строка может быть присвоена их необязательному типу аналога без каких-либо жалоб компилятора. Где именно у вас это не работает?

2. customer_id Похоже, что это параметр вашей функции firebase, который является необязательным параметром. Также, вероятно, вы могли бы определить свой документ таким образом, чтобы идентификатор customer_id сохранялся как customer_id вместо фактического document id , чтобы он мог быть необязательным

3. Вы могли бы сделать Optional.some(id) , но я сомневаюсь, что это ваша проблема

4. Вы должны объяснить, почему вы сделали id необязательной в первую очередь. Поскольку похоже, что простое объявление ее как var id: String? решит вашу проблему. Затем просто назначьте id = document.get("id") as? String ей, без ?? "" части.

Ответ №1:

Я исправил проблему. Действительно странно, как firebase возвращает необязательную, если вы используете document[«id»} в отличие от document.get(«id»).

  var id:Any? = ""
        let docRef = db.collection("Profile").document((user?.email)!)
                              docRef.getDocument(source: .cache) { (document, error) in
                                  if let document = document {
                                    id = document["id"]
                                   var data = ["api_version" : apiVersion, "customer_id" : id]
                                    self.functions.httpsCallable("getStripeEphemeralKeys").call(data) {