如何从数组中的对象中删除“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】:

设计了数据库模型您确切知道哪些记录属性始终存在。将类属性声明为隐式展开可选作为不在场证明而不编写初始化程序是非常糟糕的做法。

假设记录中的每个属性都有一个值,将属性声明为非可选并编写一个初始化程序。

至少createdrecordID 应该总是有一个值!

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()”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Javascript 从对象中删除键时,“删除”运算符的操作数必须是 optional.ts

如何让我的 X 按钮删除数组中的特定对象?

从数组中删除重复的对象

如何从firestore中的数组中删除对象

单击事件后如何从 ReactJS 中的数组中删除对象

如何从角度6中的数组中删除重复对象