【问题标题】:Swift compiler error while conforming to protocol by providing property via getter function通过 getter 函数提供属性符合协议时出现 Swift 编译器错误
【发布时间】:2014-06-05 21:41:49
【问题描述】:

我有一个类试图符合NSFilePresenter 协议。据我所知,只有两个要求,它们都是属性:

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)

如果编译器能够在我对它所做的任何事情上幸存下来会很好,但我宁愿在我的代码中解决这个问题,不管它是什么。

【问题讨论】:

  • 附带一个问题:在计算 var 的返回值时,这些“getter 函数”是什么?它似乎不太像 getter,而更像是“动态属性”,但我找不到正确术语的示例。
  • 这绝对是编译器的bug。举报吧。
  • 肯定会报告它 - 我只是来这里弄清楚我的代码中我在做错了什么,如果有的话。
  • 已举报,我会回帖。 rdar://17186304
  • 有解决办法吗?

标签: swift


【解决方案1】:

当我在类扩展中编写这样的动态属性时,我遇到了类似的问题:

class MyClass {
  func test() {
    let myVar = myProperty
  }
}

extension MyClass {
  var myProperty: String { return "TEST" }
}

MyClass().test()

当 XCode 放置在操场上时,这会使 XCode 崩溃,并且当此类代码包含在我的项目的 .swift 文件中时,它会导致构建失败并出现神秘的“Swift 编译器错误”。

可能是相关的,无论如何我报告了它(我想是 rdar://17527780)。

【讨论】:

  • 它实际上只有在您在某个时候访问该属性时才会发生。如果您从不访问它,则构建成功。
  • 如果在 getter 块中定义 return 值会更好吗? (get { ... })
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多