【发布时间】: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
- 在发射 IR SIL 函数时 @_TToFC2Me11CoreDataBox12insertObjectfS0_U__FTSS4dicoCSo12NSDictionary_T_ 对于“插入对象”在 /Users/abcxyz/Documents/iOS/LibBin/Swift_CoreDataBox/CoreDataBox.swift:98:5
【问题讨论】:
-
这可能是一个很好的建议,我该怎么做?容易(简单)吗?
-
目前没有编译器,但它应该类似于
func insertObject<T>(entityName: String, dictionary: NSDictionary,当您强制将其转换为EventList时,将其转换为T。 -
这是最好的 - swift.oz-apps.com/2015/04/…
-
对我来说似乎没有必要。
T会接受setValue方法而不进行进一步转换吗? -
感谢您的提示。我正在研究泛型以及如何使用它们。它非常有趣,看起来类似于我以前所知道的函数模板。我不知道实现是否相似。