【发布时间】:2014-11-19 16:48:11
【问题描述】:
我刚刚花了半天时间试图解决下一个问题。 我正在使用 Swift 语言测试 CoreData。 按照this 教程一切正常。
但在标题之后,我尝试修改 structure 和我的代码。 'src' 和其中的组是文件夹,而不仅仅是 xCode 创建的组。
NSSExpense.swift
import Foundation
import CoreData
class NSSExpense: NSManagedObject {
@NSManaged var name: String
@NSManaged var descr: String
@NSManaged var value: NSNumber
@NSManaged var isMonthly: NSNumber
@NSManaged var payDayInMonth: NSNumber
class func createInManagedObjectContext(moc: NSManagedObjectContext, name: String, value: Double, payDayInMonth: Int16, isMonthly: Bool, descr: String!) -> NSSExpense {
let newExpense = NSEntityDescription.insertNewObjectForEntityForName("NSSExpense", inManagedObjectContext: moc) as NSSExpense
newExpense.name = name
newExpense.value = NSNumber(double: value)
newExpense.payDayInMonth = NSNumber(short: payDayInMonth)
newExpense.isMonthly = NSNumber(bool: isMonthly)
if let expenseDesctiption = descr {
newExpense.descr = expenseDesctiption
} else {
newExpense.descr = ""
}
return newExpense
}
}
NSSDataManager.swift
import UIKit
import CoreData
class NSSDataManager: NSObject {
class var sharedDataManager: NSSDataManager {
struct Static {
static var instance: NSSDataManager?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = NSSDataManager()
}
return Static.instance!
}
lazy var managedObjectContext : NSManagedObjectContext? = {
// Error at the next line "Use of undeclared type 'NSSAppDelegate'"
let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate
if let managedObjectContext = appDelegate.managedObjectContext {
return managedObjectContext
} else {
return nil
}
}()
var expensesInMemory : [NSSExpense] {
get {
let fetchRequest = NSFetchRequest(entityName: "NSSExpense")
if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [NSSExpense] {
return fetchResults
} else {
return [NSSExpense]()
}
}
}
func addExpenseWithName(name: String, value: Double, payDayInMonth: Int16, isMonthly: Bool, descr: String!) -> NSSExpense {
return NSSExpense.createInManagedObjectContext(managedObjectContext!, name: name, value: value, payDayInMonth: payDayInMonth, isMonthly: isMonthly, descr: descr?)
}
}
我尝试了不同的方法来解决这个问题: 1)创建新项目(Swift主语言)并再次制作相同的结构(失败) 2) 创建新项目(Objective-C 主语言)。所以我有 AppDelegate.h 和 AppDelegate.m。使用 Bridging-Header 将其添加到 Swift 文件中。一样的问题。 (失败)
接下来的事情真的很有趣。如果我将下一个代码放到 ViewController.swift 中,它会自动创建新项目,一切正常。但是当我把这段代码放到任何其他类时。我已经编码了这个错误。
lazy var managedObjectContext : NSManagedObjectContext? = {
// Error at the next line "Use of undeclared type 'NSSAppDelegate'"
let appDelegate = UIApplication.sharedApplication().delegate as NSSAppDelegate
if let managedObjectContext = appDelegate.managedObjectContext {
return managedObjectContext
} else {
return nil
}
}()
[更新 1]
我尝试在与 NSSAppDelegate.swift 相同的文件夹中创建另一个类,现在一切正常。不过还是有问题,如何才能使用其他文件夹中的类呢?
[更新 2]
只是尝试在其他项目中做同样的事情。 如果文件结构类似于this,那么 AppDelegate.swift 和 NGDataManager.swift 位于同一个文件夹中,一切正常。 但是,如果我将 NGDataManager.swift 放在像this(不仅仅是组、文件夹)这样的“src”文件夹中,则会出现error。也许我应该为此创建另一个问题。
[更新 3]
我不知道怎么做,但你可以忘记我在 UDATE 2 中所说的一切。因为现在这一切都行不通了。我什至使用名为“Test”的 CoreData 创建了一个新项目,并创建了一个名为“TestClass”的新类。神奇的是接下来的事情:如果我把这段代码放在 TestClass.swift 中
import UIKit
class TestClass: NSObject {
func someFunc() {
let appDel = UIApplication.sharedApplication().delegate as AppDelegate
}
}
发生错误。但是如果我把这行放在 ViewController.swift 中的 viewDidLoad 中,它是由 xCode 自动生成的
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let appDel = UIApplication.sharedApplication().delegate as AppDelegate
}
}
他们没有错误,一切都很好。我不知道该说什么...
您可能会看到 AppDelegate 代码here,但我没有修改 xCode 自动生成的任何内容。我用this 设置创建了一个单一视图应用程序。
【问题讨论】:
-
'NSSAppDelegate' - 那应该是什么?确定是
NSApplicationDelegate? -
你不应该在你的类前面加上
NS,你以后会遇到各种各样的问题。 -
@sbarow 这是我的公司前缀 NSS。但请确保您是对的,将创建另一个前缀。不过我试过用 AppDelegate,不带前缀,这里只显示最后的代码版本。
-
@AlexandrLapshin 你能把
AppDelegate的代码贴出来吗 -
@sbarow 我的天啊!看来我找到了答案。我忘了说我创建的所有类也是为测试创建的。如果我从 this 这样的测试目标中删除标记,一切正常!是 Swift 的 bug 还是功能,我真的不知道?
标签: ios core-data swift xcode6.1 ios8.1