首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过引用传递类类型

通过引用传递类类型
EN

Stack Overflow用户
提问于 2019-09-12 19:05:42
回答 2查看 41关注 0票数 0

因此,我希望我的基础tableView,我已经导出了其他,集中拖放操作。这些tableViews中的每一个都有一个不同的数组控制器作为其dataSource,每个条目类都符合pasteboard读写协议。

但我被困在它的设置上了

代码语言:javascript
复制
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)
}

因为我犯了个错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-14 03:18:02

简短的回答:--这不是Swift的工作方式,转换(as?as!)到适当的编译时类型- in--这是在NSDraggingItem.init(pasteboardWriter: objects[index])中使用objects,可能是[NSPasteBoardWriting]

更长的答案:

你可能只是犯了一个简单的错误,我们有时都会这样做,简单的回答就足够了。但是,如果您想知道为什么您的代码不被接受,也许这会有所帮助,希望不会混淆!

您要做的是一种动态类型,您将itemClass设置为编译时所不知道的类型,只知道它是某种类类型。

Swift的核心语言本质上是一种静态类型的语言,它的工作方式是要么了解任何关于某事物类型的信息,例如宣布某物具有某种特定的引用或值类型;要么通过了解某一类型的某些内容,例如某一种类型具有协议类型;甚至什么也不知道,例如,当某事是无约束的泛型参数类型时,在所有这些情况下,所能做的事在很大程度上受到这种知识的限制。

变量类型不受支持;虽然有一些不太特定的类型,例如示例中的AnyClass,但在对特定类型(已知编译时)进行转换(使用as?as!)之前,无法执行特定于实际运行时类型的操作。

Swift确实支持一些动态类型特性,特别是它对Objective部分的支持--C- which具有静态和动态类型的部件;但这些特性不会给您提供您在这里要做的事情,即在运行时之前转换为未知类型。

您可能知道Objective,这两种语言在静态/动态方法中的区别的一个简单例子是调用方法/函数时会发生什么。由于Objective方法分派是动态的,编译后的代码执行对方法实现的搜索,搜索可能会失败,从而导致运行时错误和中止。在Swift (不包括它与Objective的交互)中,当一个函数被调用时,编译代码不进行搜索,该实现已知存在于编译时,并且不存在运行时错误和中止。

要执行您正在尝试的操作,您需要在设计时确定您需要执行所需操作的类型(在本例中是构造一个NSDraggingItem ),以及您是否完全知道或可能知道您在运行时所拥有的值是否符合该类型。如果您绝对知道可以使用as!强制转换,这会在错误的情况下中止执行,或者您可以使用as?来测试是否成功,如果您有一些计划外的类型,则可以采取适当的操作。

HTH

票数 1
EN

Stack Overflow用户

发布于 2019-09-14 13:18:59

我将把我自己的答案与Sweeper的建议和CRD出色的评论放在一起。

源对象,符合pasteboard编写协议- NSPasteboardWriting;我命令它。目标投射证实了这一点。我的问题是思考objC的一个菜鸟案例,它在源与目标之间进行转换,但强制执行相同的方法;我希望;-)。

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57913089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档