【问题标题】:Swift and Core-Data, class type as a parameterSwift 和 Core-Data,类类型作为参数
【发布时间】:2015-09-19 19:14:43
【问题描述】:

使用 Swift 和 Core-Data,我有以下函数,这对于在实体中插入新记录很有用:

func insertObject (entityName: String, dico: NSDictionary) {
    var newItem = NSEntityDescription.insertNewObjectForEntityForName(entityName, inManagedObjectContext:managedObjectContext!) as! EventList

    for (key, value) in dico {
        newItem.setValue(value, forKey: key as! String)
    }

    var error : NSError? = nil
    managedObjectContext!.save(&error)
}

虽然它有效,但存在一个问题:“EventList”类型在函数中是硬编码的,如果我希望该函数用于一般用途,那就不好了。 理想情况下,我想传递一个参数:类型给函数,然后使用它而不是“EventList”。

这可能吗?怎么做?我在网上找到的内容似乎不清楚,并且在我目前的 Swift 知识范围内。

=== 进一步实验后更新===

根据我从反馈中获得的一些建议,并在了解泛型的工作原理之后,我重新制作了我的函数,如下所示:

func insertObject <T:NSManagedObject> (entityName:String,dico:NSDictionary) {
    var newItem = NSEntityDescription.insertNewObjectForEntityForName(entityName, inManagedObjectContext:managedObjectContext!) as! T
    for (key, value) in dico {
        newItem.setValue(value, forKey: key as! String)
    }

    var error : NSError? = nil
    managedObjectContext!.save(&error)
}

我在特定的代码行上没有收到任何错误,但在问题导航器中收到以下大错误消息:

编译Swift正常armv7 /Users/abcxyz/Documents/iOS/LibBin/Swift_CoreDataBox/CoreDataBox.swift cd /Users/abcxyz/Documents/iOS/MyAp /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file /Users/abcxyz/Documents/iOS/LibBin/Swift_CoreDataBox/CoreDataBox.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/RootViewController.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/ModelController.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/DataViewController.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/MyAp.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/AppDelegate.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/DataInput_ViewController.swift -target armv7-apple-ios7.1 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk -I /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos -F /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos -g -module-cache-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/ModuleCache -serialize-debugging-options -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-generated-files.hmap -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-own-target-headers.hmap -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-all-target-headers.hmap -Xcc -iquote -Xcc /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-project-headers.hmap -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos/include -Xcc -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/DerivedSources/armv7 -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/DerivedSources -Xcc -DDEBUG=1 -Xcc -working-directory/Users/abcxyz/Documents/iOS/MyAp -emit-module-doc-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates /MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox~partial.swiftdoc -Onone -module-name Me -emit-module-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/ MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox~partial.swiftmodule -serialize-diagnostics-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.dia -emit-dependencies-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.d -emit-reference-dependencies-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.swiftdeps -o /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.o

0 迅速 0x00000001007e92b8 llvm::sys::PrintStackTrace(__sFILE*) + 40 1 快速
0x00000001007e9794 SignalHandler(int) + 452 2 libsystem_platform.dylib 0x00007fff96272f1a _sigtramp + 26 3 libsystem_platform.dylib 0x7994a32ea448635d _sigtramp + 237057117 4 迅速0x000000010016c076 swift::irgen::emitPolymorphicArguments(swift::irgen::IRGenFunction&, 迅速::CanTypeWrapper, 迅速::CanTypeWrapper, llvm::ArrayRef, swift::irgen::Explosion&) + 630 5 迅速0x00000001001b6d0f swift::SILVisitor::visit(swift::ValueBase*) + 40287 6 swift
0x00000001001ac39d swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 9901 7 迅速 0x0000000100116f4f swift::irgen::IRGenModule::emitGlobalTopLevel() + 159 8 swift
0x0000000100196c59 执行IRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 2121 9 swift 0x0000000100197693 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51 10 swift
0x00000001000d3087 frontend_main(llvm::ArrayRef, char const*, void*) + 6647 11 快速 0x00000001000d14e6 主要 + 1814 12 libdyld.dylib 0x00007fff947a35c9 开始 + 1 13 libdyld.dylib 0x0000000000000041 开始 + 1803930233 堆栈转储: 0.程序参数:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file /Users/abcxyz/Documents/iOS/LibBin/Swift_CoreDataBox/CoreDataBox.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/RootViewController.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/ModelController.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/DataViewController.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/MyAp.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/AppDelegate.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/DataInput_ViewController.swift -target armv7-apple-ios7.1 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk -I /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos -F /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos -g -module-cache-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/ModuleCache -serialize-debugging-options -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-generated-files.hmap -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-own-target-headers.hmap -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-all-target-headers.hmap -Xcc -iquote -Xcc /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-project-headers.hmap -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos/include -Xcc -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/DerivedSources/armv7 -Xcc -I/Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/DerivedSources -Xcc -DDEBUG=1 -Xcc -working-directory/Users/abcxyz/Documents/iOS/MyAp -emit-module-doc-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates /MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox~partial.swiftdoc -Onone -module-name Me -emit-module-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/ MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox~partial.swiftmodule -serialize-diagnostics-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.dia -emit-dependencies-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.d -emit-reference-dependencies-path /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.swiftdeps -o /Users/abcxyz/Library/Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.o

  1. 在发射 IR SIL 函数时 @_TToFC2Me11CoreDataBox12insertObjectfS0_U__FTSS4dicoCSo12NSDictionary_T_ 对于“插入对象”在 /Users/abcxyz/Documents/iOS/LibBin/Swift_CoreDataBox/CoreDataBox.swift:98:5

【问题讨论】:

  • 这可能是一个很好的建议,我该怎么做?容易(简单)吗?
  • 目前没有编译器,但它应该类似于func insertObject&lt;T&gt;(entityName: String, dictionary: NSDictionary,当您强制将其转换为EventList 时,将其转换为T
  • 这是最好的 - swift.oz-apps.com/2015/04/…
  • 对我来说似乎没有必要。 T 会接受 setValue 方法而不进行进一步转换吗?
  • 感谢您的提示。我正在研究泛型以及如何使用它们。它非常有趣,看起来类似于我以前所知道的函数模板。我不知道实现是否相似。

标签: swift core-data


【解决方案1】:

您只是使用 KVC 来设置属性,因此您不需要特定的NSManagedObject 子类。

将演员表替换为NSManagedObject 应该可以。让它通用(在 Swift 意义上)将是矫枉过正 - 毕竟,你需要 NSManagedObject。所以你是在“概括”而不是使用“泛型”。

【讨论】:

  • 如果我省略演员表,注释掉“as!EventList”,我会收到编译器警告:变量“newItem”推断为“AnyObject”类型,这可能是意外的。而且我认为这并不好。
  • @Michel:在那种情况下,as! NSManagedObject 应该可以解决问题。
  • 对,我认为这很明显。谢谢马丁。
  • 是的,这(部分)成功了;没有更多的编译器警告。但是,还有另一个问题,在执行该函数时,我收到以下消息:CoreData:警告:无法为实体“MyEntity”加载名为“PRODUCT_MODULE_NAME.MyEntity”的类。找不到类,而是使用默认的 NSManagedObject。作为试验,如果我用 MyEntity 替换 NSManagedObject(这是我不想做的),消息就会消失。
  • 如果您需要使用子类,您需要再次强制转换。似乎工作正常。
猜你喜欢
  • 1970-01-01
  • 2020-09-18
  • 2015-03-22
  • 2012-09-14
  • 1970-01-01
  • 2020-08-19
  • 2016-11-13
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多