Swift NSManagedObject 的扩展
Swift extension on NSManagedObject
我可以在 Objective-C 中执行此操作,但我无法弄清楚如何使其在 Swift 中运行。我正在 NSManagedObject 上编写一个扩展,这样我就可以在任何时候想创建一个新实体时简单地调用一个函数。然后该函数将检查现有实体是否匹配,如果不匹配,该函数将创建新实体并 return 它。如果有匹配项,它将 return 匹配项。这是我的代码:
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 chap: Chapter = Chapter.createChapter(...) 时,Xcode 只允许我将另一个 Chapter 对象放入参数列表,而如果我尝试从 Chapter 实例调用函数,函数参数可以正常填写。
我将如何解决我的问题?
编辑:
根据答案建议,我通过将 "class" 放在我的函数定义前面来修复我的代码,并在函数中正确创建我的初始变量并在必要的地方添加问号。
您可以尝试创建一个方便的 init。
http://devmonologue.com/ios/swift/swift-initializers-designated-convenience/
另请注意,如果您想执行 Chapter.createChapter(),createChapter 需要是一个 class 函数,在您的扩展中它只是一个常规函数。所以它期待一个章节对象来创建对象,而不是 class.
改变
func createChapter ...
至
class func createChapter ...
我可以在 Objective-C 中执行此操作,但我无法弄清楚如何使其在 Swift 中运行。我正在 NSManagedObject 上编写一个扩展,这样我就可以在任何时候想创建一个新实体时简单地调用一个函数。然后该函数将检查现有实体是否匹配,如果不匹配,该函数将创建新实体并 return 它。如果有匹配项,它将 return 匹配项。这是我的代码:
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 chap: Chapter = Chapter.createChapter(...) 时,Xcode 只允许我将另一个 Chapter 对象放入参数列表,而如果我尝试从 Chapter 实例调用函数,函数参数可以正常填写。
我将如何解决我的问题?
编辑:
根据答案建议,我通过将 "class" 放在我的函数定义前面来修复我的代码,并在函数中正确创建我的初始变量并在必要的地方添加问号。
您可以尝试创建一个方便的 init。
http://devmonologue.com/ios/swift/swift-initializers-designated-convenience/
另请注意,如果您想执行 Chapter.createChapter(),createChapter 需要是一个 class 函数,在您的扩展中它只是一个常规函数。所以它期待一个章节对象来创建对象,而不是 class.
改变
func createChapter ...
至
class func createChapter ...