如何从数组中的对象中删除“Optional()”
Posted
技术标签:
【中文标题】如何从数组中的对象中删除“Optional()”【英文标题】:How do I remove "Optional()" from object in an array 【发布时间】:2019-01-23 15:18:04 【问题描述】:所以我使用 CloudKit 并将所有数据作为 [StartDay] 提取到一个数组中,我的 StartDay 类如下所示:
import UIKit
import CloudKit
class StartDay
var recordID: CKRecord.ID!
var wakeUp: String!
var sleptWell: String!
var dNN: String!
var created: String!
get
return created
`
我的函数加载得到一个数组列表,其中包含从数据库接收到的信息。在我的数据库中,它是这样的:“22.01.09:
func checkIfButtonShouldBeEnabled(startDayList: [StartDay])
let startDayDates = startDayList.map$0.created
for i in 0..<startDayDates.count
print(startDayDates)
`
输出: 可选(“22.01.2019”) 可选(“22.01.2019”)
我想删除“Optional()”,所以它只显示“22.01.2019”,我该怎么做?
更新:获取函数
func loadStartDay() -> [StartDay]
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "StartDay", predicate: predicate)
let operation = CKQueryOperation(query: query)
var startDays: [StartDay] = []
operation.desiredKeys = ["wakeUp", "wellSlept", "dNN", "recordID", "createdDato"]
operation.recordFetchedBlock = (record:CKRecord) in
let newStartDay = StartDay()
newStartDay.wakeUp = record.object(forKey: "wakeUP") as? String
newStartDay.sleptWell = record.object(forKey: "sleptWell") as? String
newStartDay.dNN = record.object(forKey: "dNN") as? String
newStartDay.recordID = record.object(forKey: "recordID") as? CKRecord.ID
newStartDay.created = record.object(forKey: "createdDato") as? String
print(newStartDay.created)
startDays.append(newStartDay)
【问题讨论】:
你应该先用类似for date in startDayDates if let date = date print(date)
的东西打开可选的。顺便说一句,您在代码中一遍又一遍地打印相同的数组(而不是您可能想要的 i
的元素)...
"条件绑定的初始化器必须是 Optional 类型,而不是 'String'"
这意味着您尝试解包的对象不是可选的。
但是为什么打印出 optional()?我可以是因为我把它保存在cloudkit中吗?还是取错了?
在cloudkit中显示“22.01.2019”
【参考方案1】:
您可以使用print(startDayDates!)
或print(startDayDates ?? "default value")
。
但我建议使用 startDayList.compactMap()
而不是 startDayList.map()
以确保您的数组不包含 nil 值。
你也可以这样做:
startDayList
.compactMap $0.created
.forEach print($0)
【讨论】:
创建的值是可选的,这正是我正在寻找的解决方案! :D 抱歉,请忽略我之前(现已删除)的评论。上面的代码适用于您的情况 my func: ` func checkIfButtonShouldBeEnabled(startDayList: [StartDay]) let startDayDates = startDayList.compactMap$0.created for i in 0..func checkIfButtonShouldBeEnabled(startDayList: [StartDay]) startDayList.compactMap$0.created.forEachprint($0)
。
仍然打印出 Optional() :(【参考方案2】:
您设计了数据库模型您确切知道哪些记录属性始终存在。将类属性声明为隐式展开可选作为不在场证明而不编写初始化程序是非常糟糕的做法。
假设记录中的每个属性都有一个值,将属性声明为非可选并编写一个初始化程序。
至少created
和recordID
应该总是有一个值!
import UIKit
import CloudKit
class StartDay
var recordID: CKRecord.ID
var wakeUp: String
var sleptWell: String
var dNN: String
var created: String
init(record : CKRecord)
// recordID can be retrieved directly
self.recordID = record.recordID
self.wakeUp = record.object(forKey: "wakeUP") as! String
self.sleptWell = record.object(forKey: "sleptWell") as! String
self.dNN = record.object(forKey: "dNN") as! String
self.created = record.object(forKey: "createdDato") as! String
并使用
创建实例operation.recordFetchedBlock = record in
startDays.append(StartDay(record: record))
现在Optional
已经消失了。
print(startDayList.map $0.created )
【讨论】:
我收到一个错误:self.recordID = record.object(forkey: "recordID") as! CKRecordID 错误:3:致命错误:在展开可选值时意外发现 nil 在创建记录时为 CloudKit 上的recordID
分配 always 值(推荐)或将此属性声明为可选:var recordID: CKRecord.ID?
和 self.recordID = record.object(forKey: "recordID") as? CKRecord.ID
我为“wakeUP”分配了错误的值,我应该是“wakeUp”。谢谢,现在可以正常使用了!
我更新了答案。您可以直接获取唯一的非可选recordID
。以上是关于如何从数组中的对象中删除“Optional()”的主要内容,如果未能解决你的问题,请参考以下文章