"Ambiguous use of 'children'" 尝试在 Swift 3.0 中使用 NSTreeController.arrangedObjects 时

"Ambiguous use of 'children'" when trying to use NSTreeController.arrangedObjects in Swift 3.0

我在 XCode 8.0/Swift 3.0 中尝试向不透明 [=15] 发送消息时收到 Ambiguous use of 'children' 错误=] 对象。

这是一个显示用例的裸游乐场:

import AppKit

extension NSTreeController {

    func whatever () {
        let k = (self.arrangedObjects as AnyObject).children // error here
    }
}

我尝试使用 AnyObject 作为底层 ObjC 对象的桥梁,我猜它应该能够通过任何方法调用。

Xcode 表明它找到了两个可以响应 "children" 消息的候选人:Foundation.XMLNodeAppKit.NSTreeNode

当然,显而易见的解决方案(转换为 NSTreeNode)不起作用,因为 arrangedObjects returns 一个不透明的代理对象不是真实的 NSTreeNode

关于我们应该如何在 Swift 3 中使用 NSTreeController.arrangedObjects.children 有什么建议吗?

children 属性 的两位候选人的类型不同:

Foundation.XMLNode:137:14: note: found this candidate
    open var children: [XMLNode]? { get }
             ^
AppKit.NSTreeNode:12:14: note: found this candidate
    open var children: [NSTreeNode]? { get }
             ^

您可以通过转换 属性 的值来解决歧义 到预期的类型。你的情况:

let k = (self.arrangedObjects as AnyObject).children as [NSTreeNode]?

另一种解决方案:将 Obj-C 类别添加到 NSTreeController

.h

#import <Cocoa/Cocoa.h>

@interface NSTreeController (RootNodes_m)

- (NSArray *) rootNodes;

@end

.m

#import "NSTreeController+RootNodes_m.h"

@implementation NSTreeController (RootNodes_m)

- (NSArray *) rootNodes {
    NSObject *  arranged = self.arrangedObjects;

    if ([arranged respondsToSelector: @selector(childNodes)]) {
        return [arranged performSelector:@selector(childNodes)];
    }
    return nil;
}

@end

现在在您的代码中,您可以像这样使用它:

return treeController.rootNodes() as? [NSTreeNode]

我对上面的回答有疑问:打开“全模块优化”时编译器拒绝编译。 swift 扩展没有帮助。我正在使用 Xcode 8.2.1.