Быстрая компиляция при подклассе NSObject и использовании дженериков
Следующий код Swift генерирует ошибку компиляции во время сборки:
import Foundation
class Wrapper<T> : NSObject {
let obj : T
init(x : T) {
self.obj = x
}
}
Я делаю что-то неправильно или это ошибка компилятора?
Если да, что я могу сделать, чтобы обойти это?
Журнал ошибок:
CompileSwift normal i386 com.apple.xcode.tools.swift.compiler
cd /Users/hermespique/workspace/HanekeSwift
export PATH="/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode6-Beta.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -target i386-apple-ios8.0 -module-name HanekeTests -O0 -sdk /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk -g -module-cache-path /Users/hermespique/Library/Developer/Xcode/DerivedData/ModuleCache -I /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Products/Debug-iphonesimulator -F /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Products/Debug-iphonesimulator -F /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks -F /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks -F /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks -c -j4 /Users/hermespique/workspace/HanekeSwift/HanekeTests/XCTestCase+Assert.swift /Users/hermespique/workspace/HanekeSwift/HanekeTests/Cache.swift /Users/hermespique/workspace/HanekeSwift/HanekeTests/Wrapper.swift -output-file-map /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/Objects-normal/i386/HanekeTests-OutputFileMap.json -serialize-diagnostics -emit-dependencies -emit-module -emit-module-path /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/Objects-normal/i386/HanekeTests.swiftmodule -Xcc -iquote -Xcc /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/HanekeTests-generated-files.hmap -Xcc -I/Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/HanekeTests-own-target-headers.hmap -Xcc -ivfsoverlay -Xcc /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/all-product-headers.yaml -Xcc -iquote -Xcc /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/HanekeTests-project-headers.hmap -Xcc -I/Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Products/Debug-iphonesimulator/include -Xcc -I/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Xcc -I/Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/DerivedSources/i386 -Xcc -I/Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/DerivedSources -Xcc -DDEBUG=1 -Xcc -DDEBUG=1 -emit-objc-header -emit-objc-header-path /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/Objects-normal/i386/HanekeTests-Swift.h
0 swift 0x000000010a889608 llvm::sys::PrintStackTrace(__sFILE*) + 40
1 swift 0x000000010a889af4 SignalHandler(int) + 452
2 libsystem_platform.dylib 0x00007fff88e185aa _sigtramp + 26
3 libsystem_platform.dylib 0x00007fff55fb0334 _sigtramp + 3440999844
4 swift 0x0000000109c87395 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType) + 21
5 swift 0x0000000109cbcfb8 (anonymous namespace)::OpaqueArchetypeTypeInfo::destroy(swift::irgen::IRGenFunction&, swift::irgen::Address, swift::CanType) const + 24
6 swift 0x0000000109cf467b swift::SILVisitor<(anonymous namespace)::IRGenSILFunction, void>::visit(swift::ValueBase*) + 23579
7 swift 0x0000000109cee266 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 8678
8 swift 0x0000000109c6f6f8 swift::irgen::IRGenModule::emitGlobalTopLevel() + 184
9 swift 0x0000000109cdb6e3 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 1859
10 swift 0x0000000109cdc033 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51
11 swift 0x0000000109c4e65a frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 4842
12 swift 0x0000000109c4d35d main + 1533
13 libdyld.dylib 0x00007fff8ddbb5fd start + 1
14 libdyld.dylib 0x0000000000000040 start + 1914980932
Stack dump:
0. Program arguments: /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c /Users/hermespique/workspace/HanekeSwift/HanekeTests/XCTestCase+Assert.swift /Users/hermespique/workspace/HanekeSwift/HanekeTests/Cache.swift -primary-file /Users/hermespique/workspace/HanekeSwift/HanekeTests/Wrapper.swift -enable-objc-attr-requires-objc-module -target i386-apple-ios8.0 -module-name HanekeTests -sdk /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk -I /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Products/Debug-iphonesimulator -F /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Products/Debug-iphonesimulator -F /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks -F /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks -F /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks -g -module-cache-path /Users/hermespique/Library/Developer/Xcode/DerivedData/ModuleCache -Xcc -iquote -Xcc /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/HanekeTests-generated-files.hmap -Xcc -I/Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/HanekeTests-own-target-headers.hmap -Xcc -ivfsoverlay -Xcc /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/all-product-headers.yaml -Xcc -iquote -Xcc /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/HanekeTests-project-headers.hmap -Xcc -I/Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Products/Debug-iphonesimulator/include -Xcc -I/Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Xcc -I/Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/DerivedSources/i386 -Xcc -I/Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/DerivedSources -Xcc -DDEBUG=1 -Xcc -DDEBUG=1 -emit-module-doc-path /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/Objects-normal/i386/Wrapper~partial.swiftdoc -O0 -emit-module-path /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/Objects-normal/i386/Wrapper~partial.swiftmodule -serialize-diagnostics-path /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/Objects-normal/i386/Wrapper.dia -emit-dependencies-path /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/Objects-normal/i386/Wrapper.d -o /Users/hermespique/Library/Developer/Xcode/DerivedData/Haneke-dsgqpxenngbaqpctbkhhwtqbiorj/Build/Intermediates/Haneke.build/Debug-iphonesimulator/HanekeTests.build/Objects-normal/i386/Wrapper.o
1. While emitting IR SIL function @_TToFC11HanekeTests7WrapperE for 'deinit' at /Users/hermespique/workspace/HanekeSwift/HanekeTests/Wrapper.swift:11:7
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: swift frontend command failed due to signal (use -v to see invocation)
Command /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254
Ответы
Ответ 1
Я нашел обходное решение этой проблемы
class Wrapper<T> {
let _val: T[]
init(_ v: T) {
_val = [v]
}
var val : T {
get {
return _val[0]
}
set {
_val[0] = newValue
}
}
}
Так как Array
является ссылочным типом (хотя он и является структурой), размер класса Wrapper
теперь фиксируется, и компилятор может его обрабатывать.
Ответ 2
Я думаю, что его ошибка X-кода с generics и NSObject
class Foo<T>:NSObject{
let _foo:T?
init(foo:T){
_foo = foo
}
}
дает swiftc с кодом выхода 254
Удаление NSObject работает нормально. то есть:
class Foo<T>{
let _foo:T?
init(foo:T){
_foo = foo
}
}
Или, похоже, сработает ограничение ограничения на общий. то есть:
class Foo<T:AnyObject>:NSObject{
let _foo:T?
init(foo:T){
_foo = foo
}
}
Ответ 3
Я воспользовался вашим интересным (+1) фрагментом кода, и вот ближайший код, который я мог получить, избегая ошибки компилятора:
struct Wrapper<T> {
var obj : T
init(_ x : T) {
obj = x
}
}
Итак, если вам действительно не нужно, чтобы Wrapper был классом, тогда вы сможете двигаться дальше... до следующей версии Xcode;)
Ответ 4
Как я вижу, дженерикам не нравятся типы NSObjects, только AnyObject.
NSObject не соответствует AnyObject (они различны по своей природе и функциональности). Значит, вы не можете использовать Array вместо NSArray, если вам нужно создать общий метод. Я думаю, что это причина, по которой они покинули NSArray в быстром... потому что у них все еще есть NS.. вещи остались позади.. Самым важным является CoreData. Я пытался создать общий класс NSManagedObject, который будет использовать эту мощную функцию (generics). Я не мог этого сделать.
Ответ 5
Этот маленький фрагмент кода (еще один +1 от меня) все еще вызывает сбой компилятора в Xcode 7 beta 1, я думаю, предполагается, что код не является допустимым определением класса. Вежливое сообщение об ошибке вместо сбоя было бы оценено, если кто-то из Купертино прислушивается к этой теме.
Я решил это, сдерживая общий параметр для реализации NSObjectProtocol
class Wrapper<T:NSObjectProtocol> : NSObject
{
let obj : T
init(x : T) { self.obj = x }
}
Это было полезно для меня при построении функции, которая соответствует Wrapper<T>
всякий раз, когда T
является подклассом NSManagedObject
.
Ответ 6
Для Swift 2.0. Эта проблема больше не действительна.
У вас может быть класс, подобный этому, и компилятор не будет жаловаться.
class Wrapper<T> : NSObject {
let obj : T
init(x : T) {
self.obj = x
}
}