我正在尝试在swift中创建一个字典但是我遇到了错误。我尝试通过添加'?'来展开变量。不确定创建字典的正确方法
class Event: NSObject {
// When I remove the '?' on the variables it works but im not quite sure why
// Should I not be declaring variable as optional unwrapped?
var title:String?
var eventDescription:String?
var duration:Double?
var eventID:String?
var hostID:String?
var location:CLLocation?
var category:String?
var invitedUsers:[String?]
func createEvent(){
// setting up event information to save
var postEventData = [
"title": self.title,
"description":self.eventDescription,
"duration":self.duration,
"host":self.hostID,
"category":self.category
]
}
func setTitle(title:String?){
self.title = title
}
func setEventDescription(eventDescription:String?){
self.eventDescription = eventDescription
}
.....
}
答案 0 :(得分:3)
在这里你说title
(以及其他属性)可能有也可能没有值:
var title:String?
然后在这里尝试使用title
:
var postEventData = [
"title": self.title,
"description":self.eventDescription,
"duration":self.duration,
"host":self.hostID,
"category":self.category
]
如果title
没有值,您需要决定要执行的操作。应该postEventData
创建吗?它应该使用默认值吗?理论上你可以创建一个[String : String?]
的字典,但这通常没用(因为从字典中提取值已经返回一个可选的)。
因此,您可以在此处选择多个选项,具体取决于您对此数据结构的要求。
使您的属性不可选。实际上这些属性没有价值吗?也许他们应该默认为""
而不是可选的。
如果设置了所有属性,则只允许createEvent()
(我已重写createEvent
以返回值,因为您当前的代码只是创建一个变量然后将其抛出,所以我不知道不确定目标是什么:
func createEvent() -> [String: String] {
if let title = self.title,
description = self.eventDescription,
duration = self.duration,
host = self.hostID,
category = self.category {
return [
"title": title,
"description": description,
"duration": duration,
"host": host,
"category": category
]
}
return nil
}
func createEvent() -> [String: String] {
return [
"title": self.title ?? "",
"description": self.eventDescription ?? "",
"duration": self.duration ?? "",
"host": self.hostID ?? "",
"category": self.category ?? ""
]
}
作为旁注,您的set...
方法没有理由。前缀set
在Swift中具有特殊含义。来电者应该说event.title = ...
。如果您需要某种特殊的setter处理,请使用set
选项在您的属性上进行定义。
答案 1 :(得分:0)
我认为它不会让你以这种方式使用它,因为带有'?'意味着它是可选的,因为它可能是不安全的,因为内部可能是零。 您应首先针对nil检查这些属性,并显式或隐式地解包它们以供以后在字典中使用。
...
var category:String?
if let cat = self.category? {
// setting up event information to save
var postEventData = [
"category":cat
]
}
在我的示例中,您可以看到我只将类别设为可选,然后将其解包并在您的字典中使用。它的工作正常,因为没有任何值可以进入"类别"键。
修正了更清晰的理解。
答案 2 :(得分:0)
首先,您需要非可选属性的初始化,其次,Swift词典需要具有相同特定类型的所有键和值。
class Event: NSObject {
// When I remove the '?' on the variables it works but im not quite sure why
// Should I not be declaring variable as optional unwrapped?
// initialiser because of non-optional property
override init() {
self.invitedUsers = []
}
var title:String?
var eventDescription:String?
var duration:Double?
var eventID:String?
var hostID:String?
var category:String?
var invitedUsers:[String?]
func createEvent(){
// setting up event information to save
// explicitly set the values types as Any
var postEventData : Dictionary<String, Any> = [
"title": self.title,
"description":self.eventDescription,
"duration":self.duration,
"host":self.hostID,
"category":self.category
]
}
}