"模糊地使用儿童'"当试图在Swift 3.0中使用NSTreeController.arrangedObjects时

时间:2016-09-23 12:36:37

标签: swift swift3 xcode8 nstreecontroller

尝试向不透明的Ambiguous use of 'children'对象发送消息时, XCode 8.0 / Swift 3.0 中出现NSTreeController.arrangedObjects错误。

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

import AppKit

extension NSTreeController {

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

我尝试使用AnyObject作为底层ObjC对象的桥梁,我想这应该可以通过任何方法调用。

Xcode表示它找到了两个可以回应“孩子”的候选人。消息:Foundation.XMLNodeAppKit.NSTreeNode

当然,明显的解决方案(转换为NSTreeNode)无法正常工作,因为arrangedObjects会返回一个不透明的代理对象,而不是真正的NSTreeNode

有关我们如何在Swift 3中使用NSTreeController.arrangedObjects.children的任何建议?

2 个答案:

答案 0 :(得分:4)

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]?

答案 1 :(得分:1)

另一种解决方案:将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]

我遇到了上述答案的问题:编译器拒绝编译&#34;整个模块优化&#34;被打开了。快速扩展并没有帮助。我正在使用Xcode 8.2.1。