Ios 参数类型“customClass.type”与预期类型“NSItemProviderWriting”不一致

Ios 参数类型“customClass.type”与预期类型“NSItemProviderWriting”不一致,ios,swift,compiler-errors,drag-and-drop,Ios,Swift,Compiler Errors,Drag And Drop,iOS 11.x Swift 4 试图实现一个自定义类来使用新的拖放协议,需要一些超级程序员的帮助。我创建了这个类 import UIKit import MobileCoreServices class CustomClass: NSObject, NSItemProviderWriting, NSItemProviderReading { var image2D:Data? static var readableTypeIdentifiersForItemProvider = [kUT

iOS 11.x Swift 4

试图实现一个自定义类来使用新的拖放协议,需要一些超级程序员的帮助。我创建了这个类

import UIKit
import MobileCoreServices

class CustomClass: NSObject, NSItemProviderWriting, NSItemProviderReading {

var image2D:Data?

static var readableTypeIdentifiersForItemProvider = [kUTTypeData as String]

static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self {
    return try self.init(itemProviderData: data, typeidentifier: kUTTypeData as String)
}

required init(itemProviderData data: Data, typeidentifier: String) throws {
    super.init() 
    image2D = data
}

static var writableTypeIdentifiersForItemProvider = [kUTTypeData as String]

func loadData(withTypeIdentifier typeIdentifier: String, forItemProviderCompletionHandler completionHandler: @escaping (Data?, Error?) -> Void) -> Progress? {
    let data2E = image2D
    completionHandler(data2E, nil)
    return nil
}

}
它可以编译,看起来还可以吗?然后我把它和这个电话联系起来

func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {
         let itemProvider = NSItemProvider(object: CustomClass)
        let dragItem = UIDragItem(itemProvider: itemProvider)
        return [dragItem]
    }
我收到了错误信息。。。参数类型“CustomClass.type”与预期类型“NSItemProviderWriting”不一致

但除此之外,似乎无法在这里、那里或任何地方找到更多关于如何在这方面取得进展的线索

我实施了其中一个人的一个侧重点,它成功了

  itemProvider.registerDataRepresentation(forTypeIdentifier: kUTTypeJPEG as String, visibility: .all)
我实现了其中的一个,它也很有效

itemProvider.registerFileRepresentation(forTypeIdentifier: kUTTypeJPEG as String, fileOptions: [.openInPlace], visibility: .all)

所以我在想,代码不可能那么错。。。当然…

错误消息是正确的,您的线路:

let itemProvider = NSItemProvider(object: customClass)
由于所述原因,此选项不正确。对象参数需要符合NSItemProviderWriting协议的某个类的实例。但是您传入的是一个实际的类,而不是该类的实例

将customClass替换为customClass的实际实例。如果此方法在customClass内,则传递self


顺便说一句,如果您遵循标准的命名约定,这将不会太令人困惑。类和结构名称应以大写字母开头。变量和方法名称以小写字母开头。因此,您的customClass应命名为customClass。

customClass是项目中的一个类,但与itemProvider不在同一个类中。同时也会尝试采用您的命名约定!如果dragInteraction方法不在customClass实现中,那么用引用类实例的其他变量替换self;如果我需要创建一个带有值的CustomClass实例,那么在拖放过程中,我几乎丢失了所有值。我需要能够选择要拖动的图像,而不是预先填充它。我不知道你的应用程序是如何设置的。但是您似乎希望将CustomClass的一个实例作为项目提供者。因此,在创建NSItemProvider时,需要传入对CustomClass现有实例的引用。该实例的来源取决于您和您的代码。但这正是所需要的。我有一个非常类似的问题,Xcode告诉我它在范围内找不到“self”。但是,我在实现该协议的类中使用它。有什么好主意吗?
let itemProvider = NSItemProvider(object: self)