无法转换表达式类型' Dictionary'键入' StringLiteralConvertible'

时间:2015-03-14 18:55:46

标签: ios swift dictionary xcode6.1

我正在尝试在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
}
 .....
}

3 个答案:

答案 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
        ]
    }
}