为什么我得到“Swift Dynamic Cast失败”? :/

时间:2014-08-07 23:03:57

标签: ios xcode swift

我想知道是否有人可以解释" cast"或者"铸造"对我来说,关于编程也帮助我解决了获得" Swift动态演员失败的问题"在尝试执行此代码时:

import UIKit
import CoreData

class vcMain: UIViewController {

    @IBOutlet var txtUsername: UITextField!
    @IBOutlet var txtPassword: UITextField!

    @IBAction func btnSave(){
        //println("Save button pressed \(txtUsername.text)")//Adds the text written, in the console
        var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
        var context:NSManagedObjectContext = appDel.managedObjectContext

        var newUser = NSEntityDescription.insertNewObjectForEntityForName("Users", inManagedObjectContext: context) as NSManagedObjectContext
        newUser.setValue("Test Username", forKey: "username")
        newUser.setValue("Test Password", forKey: "password")

        context.save(nil)

        println(newUser)
        println("Object Saved.")


    }

    @IBAction func btnLoad(){
        //println("Load button pressed \(txtPassword.text)")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

我正在关注youtube的教程,但无法弄清楚为什么它不适合我!提前感谢您的任何答案!

3 个答案:

答案 0 :(得分:7)

这一行看起来不对:

var newUser = NSEntityDescription.insertNewObjectForEntityForName("Users", inManagedObjectContext: context) as NSManagedObjectContext

当您可能要投放到NSManagedObjectContext时,您正在投射到NSManagedObject,因此该行应为:

var newUser = NSEntityDescription.insertNewObjectForEntityForName("Users", inManagedObjectContext: context) as NSManagedObject

答案 1 :(得分:2)

我同意Jack Lawrence的回答。

我们正在查看函数NSEntityDescription.insertNewObjectForEntityForName("Users", inManagedObjectContext: context),它从文档中返回一个objC类型id,它将一个转换为Swift作为AnyObject。这就是说计算机不知道它是什么,但我们这样做,因为我们阅读了文档:

  

insertNewObjectForEntityForName:inManagedObjectContext:   为具有给定名称的实体创建,配置和返回类的实例。

     

返回值   一个名为entityName的实体的新的,自动释放的,完全配置的类实例。该实例具有其实体描述集,并将其插入上下文中。

无论如何,你可以安全地假设它返回一个NSManagedObject类型,或者它的某个子类。

现在关于施法:

大部分内容来自Swift iBook。所以你已经知道swift中的类型转换/向下转换是由 as 运算符完成的。由于向下转换可能会失败,因此类型转换运算符有两种形式。 1)强制和2)可选为?

基本上不同的是,当您不确定向下转换是否成功时,使用作为?,并在您确定它时将用作。这是一个例子,我有一个名为Vehicles ...的AnyObject类型的数组,它包含两个不同的类,Car and Truck,其中有5辆汽车和2辆卡车。

var carCount = 0
var truckCount = 0
for vehicle in vehicles{
    if let car = car as? Car
    {
        carCount++
    } else
    if let truck = truck as? Truck
    {
        truckCount++
    }
}

在结束时,我的计数是正确的,我没有抛出错误。但是,尝试访问vehicles的任何一个元素,如vehicles[i] as Car都是危险的,因为它可能是一辆卡车,而且你有力地说它是一辆汽车。运行时错误!

无论如何,我希望能够解释一下。如果没有,请查看Swift iBook中的类型转换章节,第391页。

答案 2 :(得分:0)

对于有类似问题的其他人。这里有一点点问题。

如果您尝试使用NSEntityDescription.insertNewObjectForEntityForName(Entity,inManagedObjectContext:context)方法生成自定义NSManagedObject子类,请确保swift类已将@objc()标头添加到类中。否则你也会遇到动态类强制转换失败。