我可以在Objective-C中做到這一點,但我無法弄清楚如何使它在Swift中工作。我正在寫一個NSManagedObject的擴展,以便我可以隨時調用一個函數來創建一個新的實體。然後該函數將檢查現有實體是否匹配,如果沒有匹配,該函數將創建新實體並將其返回。如果有匹配,它將返回匹配。這裏是我的代碼:NSManagedObject上的Swift擴展
extension Chapter {
class func createChapter(i_d: Int, team_level: Int, location: String, name: String, school: String, image: UIImage, context: NSManagedObjectContext) -> Chapter {
var chapter : Chapter?
var request : NSFetchRequest = NSFetchRequest(entityName: "Chapter")
request.predicate = NSPredicate(format: "i_d = \(i_d)")
var error : NSError?
var results : [Chapter] = context.executeFetchRequest(request, error: &error) as [Chapter]
if error != nil{
println(error)
} else if results.count == 1 {
println("Only found one Chapter match for id: \(i_d)")
chapter = results.first!
} else if results.count > 1 {
println("Found multiple Chapters for id: \(i_d)")
for chapter in results {
println(chapter.name)
}
} else {
chapter = NSEntityDescription.insertNewObjectForEntityForName("Chapter", inManagedObjectContext: context) as? Chapter
chapter?.i_d = i_d
chapter?.team_level = team_level
chapter?.location = location
chapter?.name = name
chapter?.school = school
chapter?.image = UIImagePNGRepresentation(image)
var error: NSError? = nil
if !context.save(&error) {
println("Saving error \(error), \(error?.userInfo)")
} else {
println("Saved a Chapter with id: \(i_d)")
}
}
return chapter!
}
}
- 「i_d」是爲實體的唯一ID
這是我曾經是能夠在Objective-C調用像這樣(大致翻譯) :
Chapter *chapter = [Chapter createChapterWithID:i_d, team_level:team_level, location:location, name:name, school:school, image:image, context:context];
每當我試着像VAR第一章:第一章= Chapter.createChapter(...),Xcode中只允許我把另一Chapte r對象,而如果我嘗試從Chapter實例調用函數,則函數參數可以正確填寫。
我該如何解決我的問題?
編輯:
從答案的建議,我通過把「階級」在我的函數定義的前面,以及正確的函數創建我最初的變量,並在必要的地方加上問號固定我的代碼。
好,加上 「下課」 的功能,使得它現在的工作之前。但是,我想我可能會在函數定義的開頭部分錯誤地聲明Chapter變量。有什麼建議嗎? –
我建議你問另一個問題,併發布相關的代碼。我不知道你是如何初始化章節對象的,因此很難說出發生了什麼事情。我也不知道你得到什麼錯誤。所以問一個新的問題,併發布所有相關的代碼和錯誤。 – Aggressor
沒關係。只是玩了一些東西,並得到它的工作。我會把它作爲一個編輯 –