Ho appena passato mezza giornata a cercare di risolvere il problema successivo. Sto testando il CoreData usando il linguaggio Swift. Segui il tutorial this, tutto funziona correttamente.Uso del tipo non dichiarato 'AppDelegate' Swift
Ma dopo titorial ho provato a modificare il structure e il mio codice. "Src" e i gruppi al suo interno sono cartelle, non solo gruppi creati da 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?)
}
}
ho cercato di risolvere questo problema modi diversi: 1) Creare nuovo progetto (Swift lingua principale) e fare lo stesso struttura di nuovo (non riuscita) 2) Creare un nuovo progetto (linguaggio principale Objective-C). Quindi ho AppDelegate.h e AppDelegate.m. Aggiungilo ai file Swift usando Bridging-Header. Lo stesso problema. (fallito)
Davvero interessante la prossima cosa. Se metto il prossimo codice su ViewController.swift che crea automaticamente con il nuovo progetto, tutto funziona correttamente. Ma quando inserisco questo codice in un'altra classe. Ho codificato questo errore.
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
}
}()
[UPDATE 1]
Ho cercato di creare un altro diritto classe alla stessa cartella NSSAppDelegate.swift e ora tutto funziona bene. Tuttavia è ancora un problema, come posso usare le classi che sono archiviate in altre cartelle?
[UPDATE 2]
solo cercato di fare la stessa cosa in un altro progetto. Se la struttura del file è come this, così AppDelegate.swift e NGDataManager.swift si trovano nella stessa cartella, tutto funziona alla grande. MA, se inserisco NGDataManager.swift all'interno della cartella 'src' come this (non solo gruppo, cartella) si verifica error. Forse dovrei creare l'altra domanda per questo.
[UPDATE 3]
Non so come, ma si può dimenticare tutto quello che ho detto nel UDATE 2. Perché ora questo è tutto non funziona. Creo persino un nuovo progetto con CoreData denominato "Test" e creo solo una nuova classe chiamata "TestClass". La magia è nella prossima cosa: se ho messo questo codice all'interno del TestClass.swift
import UIKit
class TestClass: NSObject {
func someFunc() {
let appDel = UIApplication.sharedApplication().delegate as AppDelegate
}
}
si verifica l'errore. Ma se metto questa linea in viewDidLoad in ViewController.swift che è stata generata automaticamente dal xCode
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let appDel = UIApplication.sharedApplication().delegate as AppDelegate
}
}
loro è alcun errore e tutto funziona alla grande. Non so cosa dire ...
Potresti vedere il codice AppDelegate here ma non ho modificato nulla generato automaticamente da xCode. Ho creato un'applicazione di visualizzazione singola con le impostazioni this.
'NSSAppDelegate' - che cosa dovrebbe essere? Sicuramente è 'NSApplicationDelegate'? – Grimxn
Non dovresti avere come prefisso le tue classi con 'NS', in futuro ti imbatterai in tutti i tipi di problemi. – sbarow
@sbarow questo è il prefisso della mia azienda NSS. Ma certo che hai ragione, creerà l'altro prefisso. Tuttavia, ho provato a utilizzare AppDelegate, senza il prefisso, solo per mostrare l'ultima versione del codice qui. – Doshipak