ios - fatal error : Can't unwrap Optional. 无 将 Swift 与 Parse 结合使用时

标签 ios swift parse-platform

我已经按照这个将您的 swift 应用程序连接到 Parse.com 的教程进行操作:http://ios-blog.co.uk/tutorials/connect-your-swift-application-to-parse-com/效果很好。本教程仅向您展示如何在 Parse.com 服务上放置数据。所以我对如何检索数据做了一些研究。

在第一个教程中,它说要像这样向 Parse 添加数据:

    Parse.setApplicationId("your_application_key", clientKey: "your_client_key")

    var object = PFObject(className: "testDataClass")
    object.addObject("iOSBlog", forKey: "websiteUrl")
    object.addObject("Five", forKey: "websiteRating")
    object.save()

Parse 团队 (http://blog.parse.com/2014/06/06/building-apps-with-parse-and-swift/) 在第二个教程中说要这样写:

var gameScore = PFObject(className: "GameScore")
gameScore.setObject(1337, forKey: "score")
gameScore.setObject("Sean Plott", forKey: "playerName")
gameScore.saveInBackgroundWithBlock { 
    (success: Bool!, error: NSError!) -> Void in
    if success {
        NSLog("Object created with id: \(gameScore.objectId)")
    } else {
        NSLog("%@", error)
    }
}

然后要检索它,请使用此代码:

 var query = PFQuery(className: "GameScore")
 query.getObjectInBackgroundWithId(gameScore.objectId) {
 (scoreAgain: PFObject!, error: NSError!) -> Void in
     if !error {
        NSLog("%@", scoreAgain.objectForKey("playerName") as NSString)
     } else {
        NSLog("%@", error)
    }
}

但是,当我使用官方解析代码时,出现以下错误:

fatal error: Can't unwrap Optional.None
(lldb) 

所有这些事情几乎都发生在 Xcode 的每个面板中:

xcodeDebug

谁能告诉我哪里出了问题以及如何解决?我对 Xcode 和 Swift 比较陌生,所以我非常感谢外行人的回答。

编辑 这是 appDelegate.swift 函数

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

    // Connect to Parse using the keys provided

    Parse.setApplicationId("xxx", clientKey: "xxx")

    // Store Data to Parse

    var gameScore = PFObject(className: "GameScore")
    gameScore.setObject(1337, forKey: "score")
    gameScore.setObject("Sean Plott", forKey: "playerName")
    gameScore.saveInBackgroundWithBlock {
        (success: Bool!, error: NSError!) -> Void in
        if success {
            NSLog("Object created with id: \(gameScore.objectId)")
        } else {
            NSLog("%@", error)
        }
    }

    var query = PFQuery(className: "GameScore")
    query.getObjectInBackgroundWithId(gameScore.objectId) {
        (scoreAgain: PFObject!, error: NSError!) -> Void in
        if !error {
            NSLog("%@", scoreAgain.objectForKey("playerName") as NSString)
        } else {
            NSLog("%@", error)
        }
    }



    // Override point for customization after application launch.
    return true
}

非常感谢。

添加了新代码供用户查看:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

    // Connect to Parse using the keys provided

    Parse.setApplicationId("xxxx", clientKey: "xxxx")

    // Store Data to Parse

    var gameScore = PFObject(className: "GameScore")
    gameScore.setObject(1337, forKey: "score")
    gameScore.setObject("Sean Plott", forKey: "playerName")
    gameScore.saveInBackgroundWithBlock {
        (success: Bool!, error: NSError!) -> Void in
        if (success ?? false) {
            NSLog("Object created with id: \(gameScore.objectId)")
        } else {
            NSLog("%@", error)
        }
    }

    var query = PFQuery(className: "GameScore")
    query.getObjectInBackgroundWithId(gameScore.objectId) {
        (scoreAgain: PFObject!, error: NSError!) -> Void in
        if error == nil {
            NSLog("%@", scoreAgain.objectForKey("playerName") as NSString)
        } else {
            NSLog("%@", error)
        }
    }



    // Override point for customization after application launch.
    return true
}

最佳答案

这个 Parse 示例是在 6 月份编写的,当时 Swift 处于 Beta 阶段。 Swift 不断发展,因此他们所做的一些事情在 Swift 中不再合法。

首先,您不能再检查可选变量是否为 errornilif !error .相反,您必须明确检查 nil像这样:if error == nil .

其次,success被声明为隐式展开的可选。检查是否为true不再有效与 if success .你可以做 if success == true但是如果 success 这会崩溃是nil .相反,你可以做 if (success ?? false) .这使用 nil 合并运算符 安全地解包可选的 Bool如果它有一个值或者它使用 false如果Boolnil .无论哪种方式,if只有在 Bool 时才会成功是true .

关于ios - fatal error : Can't unwrap Optional. 无 将 Swift 与 Parse 结合使用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27077488/

相关文章:

ios - 如何在 UIScrollView 或等效物中实现 touchesEnded

ios - sceneView.delegate 和 sceneView.session.delegate 有什么区别?

ios - 永远不要退出while循环

ios - 解析类通过 For 循环运行

ios - 在 iOS 中使用 Parse 时自动注销功能

iphone - 我怎样才能把一个字符串中所有单词的首字母变成大写iphone

ios - 如果用户单击 UIView 中的 "+"按钮,我如何在 UITableviewcells 中显示 UITextfields

ios - Swift 中的开关 - 开关中的 Case 标签应该至少有一个可执行语句

结构上的 Swift 扩展使得私有(private)初始化保护变得不可能

java - ParseFile 的图像 URL?