我想知道是否有人可以解释" 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的教程,但无法弄清楚为什么它不适合我!提前感谢您的任何答案!
答案 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()标头添加到类中。否则你也会遇到动态类强制转换失败。