2015-07-02 3 views
2

Работа с Свифт и Core-Data, у меня есть следующая функция, которая полезна для вставки новой записи в объекте: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».

Это возможно и как? То, что я нашел в сети, кажется непонятным и на пределе моего нынешнего знания Свифта.

=== Обновление после дальнейшего эксперимента ===

После некоторые советы я получил от корма спины и после того, как взглянуть на то, как работают генерики, я переделал свою функцию следующим образом:

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) 
} 

Я не получил какой-либо ошибки на конкретной строке кода, но получил следующую большую ошибку-сообщение в выпуске навигатора:

CompileSwift нормальный ARMv7 /Users/abcxyz/Документы/IOS/LibBin/Swift_CoreDataBox/CoreDataBox.swift кд/Пользователи/abcxyz/Документы/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 /Пользователи/abcxyz/Documents/iOS/MyAp/MyAp/ModelController. скор /Users/abcxyz/Documents/iOS/MyAp/MyAp/DataViewController.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/MyAp.swift /Пользователи/abcxyz/Документы/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/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Продукты/Debug-iphoneos -F/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos -g -module-cache-path/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/ModuleCache -serialize-debugging-options -Xcc -I/Пользователи/abcxyz/Библиотека/Разработчик/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/Пользователи/abcxyz/Библиотека/Разработчик/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/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos/include -Xcc -I/Applications/Xcode.app/Содержание/Разработчик/Toolchains/XcodeDefault.xctoolchain/usr/include -Xcc -I/Пользователи/abcxyz/Библиотека/Разработчик/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/Пользователи/abcxyz/Documents/iOS/MyAp -emit-module-doc-путь /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 -о /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 быстрого :: irgen :: emitPolymorphicArguments (быстрое :: irgen :: IRGenFunction &, быстра :: CanTypeWrapper, быстра :: CanTypeWrapper, LLVM :: ссылка на массив, быстрое :: irgen :: взрыва &) + 630 5 swift 0x00000001001b6d0f swift :: SILVisitor < (anony МЫ пространства имен) :: IRGenSILFunction, пустоты> :: Визит (быстрое :: ValueBase *) + 40287 6 быстрый
0x00000001001ac39d быстр :: irgen :: IRGenModule :: emitSILFunction (быстрый :: SILFunction *) + 9901 7 быстрых 0x0000000100116f4f быстр :: irgen :: IRGenModule :: emitGlobalTopLevel() + 159 8 стремительных
0x0000000100196c59 performIRGeneration (стремительный :: IRGenOptions &, быстры :: Module *, быстра :: SILModule *, LLVM :: StringRef, LLVM: : LLVMContext &, swift :: SourceFile *, unsigned int) + 2121 9 swift 0x0000000100197693 swift :: performIRGeneration (swift :: IRGenOptions &, swift :: SourceFile &, быстра :: SILModule *, LLVM :: StringRef, LLVM :: LLVMContext &, беззнаковое целое) + 51 10 быстрого
0x00000001000d3087 frontend_main (LLVM :: ссылки на массив, символ сопза *, * недействительный) + 6647 11 быстрое 0x00000001000d14e6 главная + 1814 12 libdyld.dylib 0x00007fff947a35c9 старт + + 1803930233 дамп 1 13 libdyld.dylib 0x0000000000000041 начать стека: 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 /Пользователи/abcxyz/Documents/iOS/MyAp/MyAp/RootViewController.скор /Users/abcxyz/Documents/iOS/MyAp/MyAp/ModelController.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/DataViewController.swift /Пользователи/abcxyz/Документы/IOS/MyAp/MyAp/MyAp .swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/AppDelegate.swift /Users/abcxyz/Documents/iOS/MyAp/MyAp/DataInput_ViewController.swift -target ARMv7-яблочно-ios7.1 -enable-ObjC -interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk -I/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Создание/Продукты/Debug-iphoneos -F/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos -g -module-cache-pat h/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/ModuleCache -serialize-debugging-options -Xcc -I/Пользователи/abcxyz/Библиотека/Разработчик/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/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp -own-target-headers.hmap -Xcc -I/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-all- target-headers.hmap -Xcc -iquote -Xcc/Пользователи/abcxyz/Библиотека /Developer/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/MyAp-project-headers.hmap -Xcc -I/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Products/Debug-iphoneos/include -Xcc -I/Приложения/Xcode.app/Содержание/Разработчик/Toolchains/XcodeDefault.xctoolchain/usr/include -Xcc -I/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/DerivedSources/armv7 -Xcc -I/Пользователи/abcxyz/Библиотека/Разработчик/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- путь/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/Deri vedData/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-ehmiuzpyuhwbkpfvduswfbhkd jut/Build/Intermediates/MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.swiftdeps -o/Пользователи/abcxyz/Библиотека/Разработчик/Xcode/DerivedData/MyAp-ehmiuzpyuhwbkpfvduswfbhkdjut/Build/Intermediates /MyAp.build/Debug-iphoneos/MyAp.build/Objects-normal/armv7/CoreDataBox.o

  1. в то время как излучающие функции ИК-SIL @ _TToFC2Me11CoreDataBox12insertObjectfS0_U__FTSS4dicoCSo12NSDictionary_T_ для '' insertObject в /Пользователи/abcxyz/Документы/Ios/LibBin/Swift_CoreDataBox/CoreDataBox.скоро: 98: 5
+0

Сделать его общим! :) – HAS

+0

Это, наверное, хороший совет, как мне это сделать? Легко ли (просто)? – Michel

+0

У меня нет компилятора прямо сейчас, но это должно быть что-то по строкам 'func insertObject (entityName: String, dictionary: NSDictionary', а когда вы вынуждаете его переводить в' EventList', то вместо него следует использовать 'T'. – HAS

ответ

1

Вы просто используете KVC, чтобы установить атрибуты, так вам не нужен конкретный NSManagedObject подкласс.

Подставляя отливку с одной на NSManagedObject, следует работать. Сделать его универсальным (в смысле Swift) было бы излишним - в конце концов, вам нужен NSManagedObject. Таким образом, вы «обобщаете», а не используете «дженерики».

+0

Если я не принимаю актеры, комментируя «как! EventList», я получаю предупреждение о компиляторе: переменная «newItem» предполагает наличие типа «AnyObject», что может быть неожиданным. И я полагаю, что это не хорошо. – Michel

+0

@Michel: В этом случае 'как! NSManagedObject' должен поступить. –

+0

Правильно, я думал, это очевидно. Спасибо Мартину. – Mundi

Смежные вопросы