所以最近我从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”:可选(“ 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
答案 0 :(得分:2)
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
答案 1 :(得分:1)
如果要打印可选值,Xcode将打印与单词optional(“值”)重合的值。
如果要避免这种情况,则必须修改值。 您有3种方法可以做到这一点:
谨慎的方法,使用警卫队let或if let:
if let branchId = profile.value(forKey: "branchId") as? String {
//here branchId != nil
}
guard let branchId = profile.value(forKey: "branchId") as? String else { return }
力量解开的方式:
让branchId = profile.value(forKey:“ branchId”)为!字符串
这样,如果值为nil,应用程序将崩溃,因此请小心
使用默认值:
让branchId = profile.value(forKey:“ branchId”)为?字符串?? “默认值”
答案 2 :(得分:0)
我最终使用了{strong> coalescing运算符,即?? ""
,并用以下代码实现了该代码:
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 ?? ""
]
}
}