通过引用传递的类类型(Passing a class type by reference)

2019-10-30 14:37发布

所以,我想我在我的基地的tableView,当我已经得到的人,集中拖拽正拖放操作。 每个这些tableViews的具有独特的阵列控制器作为其DataSource,与每个项目类贴合至粘贴板读取和写入协议。

但是我卡上的设置

override func mouseDragged(with event: NSEvent) {
    let arrayController = self.dataSource as! NSArrayController
    let itemClass = arrayController.objectClass
    let objects = arrayController.arrangedObjects as! [itemClass]
    let indexSet = self.selectedRowIndexes
    var items = [NSDraggingItem]()

    for index in indexSet {
        let item = NSDraggingItem.init(pasteboardWriter: objects[index])
        items.append(item)
    }
    self.beginDraggingSession(with: items, event: event, source: self)
}

我得到一个错误?

Answer 1:

答案很简单:这恰恰是没有作品,演员(怎么雨燕as?as! ),以合适的编译时间类型-在这种情况下,从使用的objectsNSDraggingItem.init(pasteboardWriter: objects[index])这可能是[NSPasteBoardWriting]

更长的答案:

你可能刚刚作出了一个简单的错误,我们有时会做的,简单的答案是不够的。 但是,如果你想知道为什么你的代码不被接受,也许这将帮助,并希望不要混淆!

你所要做的是动态类型的一种形式,设置itemClass ,以一个类型,在编译时一无所知,除了它是一些类类型。

其核心斯威夫特本质上是一种静态类型语言,它的工作原理是对某事的类型,例如,当一些被声明为具有特定引用或值类型要么知道的一切; 通过知道大约的类型,例如,当一些具有协议类型的东西; 甚至什么都没有,例如,当某事是在所有这些情况下,可以做什么在很大程度上是由这方面的知识有限的约束泛型参数类型的

变量类型不支持; 同时也有少特定类型,例如AnyClass具体到实际运行时类型的东西在这个例子中,操作不能直到投给特定的执行(编译时已知)类型的情况下(与as?as!

迅速确实支持一些动态类型的特征,特别是在其对目标C的部分的支持 - 同时具有静态和动态类型的部件; 但这些不给你,你正试图在这里做什么,即转换为一种未知的,直到运行时。

你可能知道的Objective-C,两种语言的静态/动态的方法有什么不同一个简单的例子是,当一个方法/函数被调用时会发生什么。 对于Objective-C的方法调度是动态的,已编译的代码执行该方法的实施的搜索和搜索可能失败 ,导致运行错误并中止。 在斯威夫特(不包括与Objective-C的互通),当一个函数被调用编译后的代码搜索,实施被称为在编译时存在,有可能通过不运行时错误并中止。

要做到你需要你尝试什么,以确定在设计时 ,你需要什么类型的执行所需的操作(构建NSDraggingItem在这种情况下),以及是否您无论是绝对知道或可能知道你会在运行时符合该类型的值。 如果你绝对知道你可以使用as! 投,这将中止执行,如果你错了,或者你可以使用as? 它允许你测试成功,并采取适当的行动,如果你有计划外的类型的东西。

HTH



Answer 2:

我断定我自己的答案扫的建议和CRD的优秀评论。

源对象,符合纸板写入协议 - NSPasteboardWriting; 我会这样做吗。 目标铸造证实了这一点。 我的问题是思维objC的小白情况下,投在源代码对目标,但执行一样的; 我希望 ;-)。

override func mouseDragged(with event: NSEvent) {
    let arrayController = self.dataSource as! NSArrayController
    let objects = arrayController.arrangedObjects as! [NSPasteboardWriting]
    let delegate = self.delegate as! NSViewController
    let indexSet = self.selectedRowIndexes
    var items = [NSDraggingItem]()

    for index in indexSet {
        let dragImage = (delegate.view.window?.windowController?.document as! Document).displayImage!
        let item = NSDraggingItem.init(pasteboardWriter: objects[index])
        item.setDraggingFrame(self.rect(ofRow: index), contents: dragImage)
        item.draggingFrame = self.rect(ofRow: index)
        items.append(item)
    }
    self.beginDraggingSession(with: items, event: event, source: self)
}


文章来源: Passing a class type by reference
标签: swift5