Swift 我如何删除“;可选();从数组中的对象

Swift 我如何删除“;可选();从数组中的对象,swift,cloudkit,Swift,Cloudkit,因此,我使用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

因此,我使用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
    }
}
}`
我的函数加载获取一个arraylist,其中包含从数据库接收的信息。在我的数据库中是这样的:“22.01.09:

    func checkIfButtonShouldBeEnabled(startDayList: [StartDay]){

    let startDayDates = startDayList.map{$0.created}

    for i in 0..<startDayDates.count {

        print(startDayDates)

    }

}`
您可以使用
打印(开始日期!)
打印(开始日期??“默认值”)

但是我建议使用
startDayList.compactMap()
而不是
startDayList.map()
,以确保数组不包含零值

您也可以这样做:

startDayList
.compactMap{$0.created}
.forEach{print($0)}

As您设计了数据库模型您确切地知道始终存在哪些记录属性。将类属性声明为隐式未包装可选项作为不编写初始值设定项的借口是非常糟糕的做法

假设记录中的每个属性都有一个值,则将属性声明为非可选,并编写初始值设定项

至少创建的
记录ID
应该始终有一个值

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))
}
现在,
可选的
已经消失

print(startDayList.map{ $0.created })

首先,您应该使用如下内容打开可选数组:
for date in startDayDates{if let date=date{print(date)}
。顺便说一句,您在代码中反复打印相同的数组(而不是像您可能希望的那样打印
i
处的元素)…。“条件绑定的初始值设定项必须具有可选类型,而不是“String”“这意味着您试图展开的对象不是可选的。但为什么打印出可选的()?我可以这样保存在cloudkit中吗?或者在中提取错误?在CloudKitt中显示“22.01.2019”。创建的值是可选的,这就是我正在寻找的解决方案!:对不起,不要理会我以前(现在已删除)的评论。上面的代码将在您的案例中工作。我的func:`func checkIfButtonShouldBeEnabled(startDayList:[StartDay]){let startDayDates=startDayList.compactMap{$0.created}用于0中的i。.尝试以下
func checkIfButtonShouldBeEnabled(startDayList:[StartDay]){startDayList.compactMap{$0.created}.forEach{print($0)}
。仍然打印可选():(我在:self.recordID=record.object(forkey:recordID)上得到一个错误作为!CKRecordID错误:3:致命错误:在打开可选值时意外发现为零。创建记录时,请始终为CloudKit上的
recordID
指定一个值(推荐)或者将此属性声明为可选:
var recordID:CKRecord.ID?
self.recordID=record.object(forKey:“recordID”)作为?CKRecord.ID
我为“唤醒”分配了错误的值,我应该是“唤醒”。谢谢,现在工作顺利!我更新了答案。您可以直接获得唯一的非可选
recordID
print(startDayList.map{ $0.created })