参数类型'customClass.Type'不符合预期类型'NSItemProviderWriting'

时间:2017-11-28 15:11:38

标签: ios swift compiler-errors drag-and-drop

iOS 11.x Swift 4

尝试使用新的drop and drag协议实现自定义类,并需要一些超级编码器帮助。我创建了这个类。

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)

所以我在想,代码不能错...当然......

1 个答案:

答案 0 :(得分:8)

错误消息是正确的,您的行:

let itemProvider = NSItemProvider(object: customClass)
由于上述原因,

不正确。 object参数期望某个类的实例符合NSItemProviderWriting协议。但是你传递的是一个实际的类,而不是该类的实例。

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

let itemProvider = NSItemProvider(object: self)

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