"__weak typeof(self) weakSelf = self;" 期望在声明的结尾处有一个分号。

19

我在Xcode 6.4中打开了两个项目,它们都使用以下声明:

- (void)startService
{
    __weak typeof(self) weakSelf = self;
    [self.messageOperationQueue addOperationWithBlock:^{
        NSDictionary *storedMessages = [mySettings get:kStorageName withDefault:@{} storageType:kMySettingsStorageTypeDiskMapped];
        [weakSelf.messages addEntriesFromDictionary:storedMessages];
    }];
}

然而,在一个项目中没有错误,而在另一个项目中我得到了编译器错误:

Expected ';' at end of declaration
它希望我在 __weak typeof(self) 后面放一个分号。我怀疑我可能只是做了一些非常愚蠢的事情,但我很难弄清楚具体是什么。此外,我知道我可以用 myClass * 替换 typeof(self)

试图删除这行并重写它。 - Bannings
你在这个项目中使用ARC吗?如果没有,请尝试使用__block而不是__weak - musical_coder
@LeoNatan __typeof 起作用了。为什么? - Ben Flynn
@LeoNatan 是的,但我的观点是Swift使得正确编程变得更加容易。它基本上扭曲了你的手臂并强迫你这样做。 :) - matt
@matt 我并不是特别喜欢这个,但说实话,ARC 做得大多数都很对。如果苹果再进一步提供一个提示系统来告诉编译器/运行时如何捕获作用域对象,那么在 ObjC 中它就会比 Swift 更完美。让我们承认吧,__weak __typeof(self) weakSelf = self; 看起来很丑。 - Léo Natan
显示剩余11条评论
2个回答

37

使用__typeof代替typeof

这是因为__typeoftypeof都是C语言的扩展,在Clang中,只有当语言是C的GNUXX变体时,typeof才能被启用,但对于CXX则不行。


6

我曾经遇到过类似的错误。@Leo Natan是正确的,如果你愿意,你可以像这样将C方言更改为GNU:

在项目导航器中,进入 项目 -> 目标 -> 构建设置

在那里找到 C语言方言 并将其从 c11 或 c99 更改为 GNU99,它将解决问题。现在你可以使用 typeof()

希望对你有所帮助 :)


1
这个应该设置为“编译器默认值”。 - Wayne Hartman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接