尝试向不透明的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.XMLNode
和AppKit.NSTreeNode
。
当然,明显的解决方案(转换为NSTreeNode
)无法正常工作,因为arrangedObjects
会返回一个不透明的代理对象,而不是真正的NSTreeNode
有关我们如何在Swift 3中使用NSTreeController.arrangedObjects.children
的任何建议?
答案 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)
#import <Cocoa/Cocoa.h>
@interface NSTreeController (RootNodes_m)
- (NSArray *) rootNodes;
@end
#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。