"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.XMLNode
和 AppKit.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.
我在 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.XMLNode
和 AppKit.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.