Обновление к Xcode 10 сделало значение, обернутое с "Дополнительным ()" - PullRequest
0 голосов
/ 04 декабря 2018

Так что недавно я переключился с Xcode 9 на Xcode 10 для разработки приложений для iOS.Первое, что я заметил, когда я пытался распечатать переменную, значение оборачивается необязательным , тогда как в Xcode 9 никогда не происходило .например, вот код, который я тестирую.

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
let parameters = ["branch_id": loginData.profile.branchId, 
                  "version": "\(version).\(build)", 
                  "os_name" : "ios", 
                  "user_id" : loginData.uid]
print(parameters)

и вывод был таким:

["os_name": "ios", "branch_id": Optional ("2 ")," version ":" 1.5.8.3 "," user_id ": Необязательно (" 1141 ")]

Я пытался принудительно развернуть код с восклицательным знаком

"branch_id": loginData.profile.branchId!,

или даже лучше с оператором объединения

"branch_id": loginData.profile.branchId ?? "0"

Это работает, но у меня есть более 30 строк кода с той же проблемоймне нужно сделать это один за другим?Или есть способ изменить это поведение?

К вашему сведению, я использую Swift 4 для своего проекта.Редактировать: к вашему сведению, это было протестировано на iOS 12, в то время как раньше в Xcode 9 тестировалось на iOS 11

Редактировать:

Чтобы ответить matt комментарий, запрашивающий информацию о том, где loginData.profile.branchId взяли, вот оно.

Итак, данные извлекаются из модель данных , и я использую этот код для извлечения:

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "User")
let fetchResults = try context.fetch(request) as? [NSManagedObject]
let loginData = fetchResults![0]
let profile = loginData.value(forKey: "profile") as! NSManagedObject
self.profile = Profile()
self.profile.branchId = profile.value(forKey: "branchId") as? String

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

если вы печатаете необязательное значение, Xcode печатает значение, заключенное в слово «необязательный» («value»).

, если вы хотите избежать этого, вы должны перевернуть значение.у вас есть 3 способа сделать это:

  1. осторожным способом, используйте охрану let или если позволяете:

    if let branchId = profile.value(forKey: "branchId") as? String {
          //here branchId != nil
      }
    
      guard let branchId = profile.value(forKey: "branchId") as? String else { return }
    
  2. путь развернутой силы:

    let branchId = profile.value (forKey: "branchId") как!Строка

на этом пути, если значение равно nil, приложение будет аварийно завершать работу, поэтому будьте осторожны

использовать значение по умолчанию:

let branchId = profile.value (forKey: "branchId") как?Строка ??«значение по умолчанию»

0 голосов
/ 04 декабря 2018

В итоге я использовал оператор объединения , который равен ?? "", и реализовал его мой код как:

var parameters = [String: Any]()
if loginData.profile != nil {
    if loginData.profile.branchId != "" {
        let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
        let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
        parameters = ["branch_id": loginData.profile.branchId ?? "", 
                      "version" : "\(version).\(build)", 
                      "os_name" : "ios", 
                      "user_id" : loginData.uid ?? ""
                      ]
    }
}
0 голосов
/ 04 декабря 2018

Использовать необязательное развертывание с оператором if-let

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "User")
        if let fetchResults = try context.fetch(request) as? [NSManagedObject]{
            let loginData = fetchResults[0]
            let profile = loginData.value(forKey: "profile") as! NSManagedObject
            self.profile = Profile()
            if let branchId = profile.value(forKey: "branchId") as? String{
                self.profile.branchId = branchId
            }
        }

if let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String, let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as? String{
            let branchId = loginData.profile.branchId ?? ""
            let branchId = loginData.uid ?? ""
            let parameters = ["branch_id": branchId,
                              "version": "\(version).\(build)",
                "os_name" : "ios",
                "user_id" : login_tty.uid]
            print(parameters)
        }

Никогда не используйте принудительное развертывание, я имею в виду!напрямую, это может привести к сбою, вместо этого безопасно разверните, используя if let и guard let

...