我有一个试图符合 NSFilePresenter
协议(protocol)的类。据我所知,只有两个要求,而且它们都是属性:
var presentedItemURL: NSURL! { get }
var presentedItemOperationQueue: NSOperationQueue! { get }
因为我正在将我现有的 Objective-C 项目迁移到 Swift,所以我已经将其中一个作为我想要维护的 ivar 进行了维护:
var _trackingURL: NSURL! = ...
var presentedItemURL: NSURL! {
return _trackingURL
}
var presentedItemOperationQueue: NSOperationQueue! {
return NSOperationQueue.mainQueue()
}
但是,此构建由于 Xcode 中的“Swift 编译器错误”而失败,但并未说明我做错了什么。我有来自编译器的堆栈跟踪,但我无法破译根本问题是什么:
0 swift 0x000000010b10b608 llvm::sys::PrintStackTrace(__sFILE*) + 40
1 swift 0x000000010b10baf4 SignalHandler(int) + 452
2 libsystem_platform.dylib 0x00007fff92578f1a _sigtramp + 26
3 libsystem_platform.dylib 0x00007fd0c225e968 _sigtramp + 802052712
4 swift 0x000000010a74797a (anonymous namespace)::ObjCPrinter::visitVarDecl(swift::VarDecl*) + 762
5 swift 0x000000010a746f7d swift::ASTVisitor<(anonymous namespace)::ObjCPrinter, void, void, void, void, void, void>::visit(swift::Decl*) + 125
6 swift 0x000000010a74abcb (anonymous namespace)::ObjCPrinter::printMembers(swift::IteratorRange<swift::DeclIterator>) + 251
7 swift 0x000000010a747603 swift::ASTVisitor<(anonymous namespace)::ObjCPrinter, void, void, void, void, void, void>::visit(swift::Decl*) + 1795
8 swift 0x000000010a74638e swift::printAsObjC(llvm::raw_ostream&, swift::Module*) + 1934
9 swift 0x000000010a4d0b6e printAsObjC(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, swift::Module*) + 286
10 swift 0x000000010a4d0178 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 3592
11 swift 0x000000010a4cf35d main + 1533
12 libdyld.dylib 0x00007fff978e45c9 start + 1
...
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: merge-module command failed due to signal (use -v to see invocation)
如果编译器能够在我对它所做的一切中幸存下来就好了,但我宁愿只在我的代码中修复这个问题,不管它是什么。
最佳答案
当我在类扩展中编写这样的动态属性时,我遇到了类似的问题:
class MyClass {
func test() {
let myVar = myProperty
}
}
extension MyClass {
var myProperty: String { return "TEST" }
}
MyClass().test()
当放置在 Playground 上时,这会使 XCode 崩溃,并且当此类代码包含在我项目的 .swift
文件中时,它会导致构建失败并出现神秘的“Swift 编译器错误”。
可能是相关的,无论如何我报告了它(我想是 rdar://17527780)。
关于Swift 编译器错误,同时通过 getter 函数提供属性来遵守协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24070672/