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

Posted

技术标签:

【中文标题】参数类型“customClass.Type”不符合预期类型“NSItemProviderWriting”【英文标题】:Argument type 'customClass.Type' does not conform to expected type 'NSItemProviderWriting' 【发布时间】:2018-05-12 02:28:07 【问题描述】:

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)

所以我在想,代码不可能是错的……当然……

【问题讨论】:

【参考方案1】:

错误信息是正确的,你的行:

let itemProvider = NSItemProvider(object: customClass)

由于所述原因不正确。 object 参数需要一个符合 NSItemProviderWriting 协议的类的实例。但是你传入的是一个实际的类,而不是类的实例。

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

let itemProvider = NSItemProvider(object: self)

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

【讨论】:

customClass 是项目中的一个类,但与 itemProvider 不在同一个类中。同时也会尝试采用您的命名约定! 如果dragInteraction 方法不在您的customClass 实现中,则将self 替换为引用您的类实例的其他变量。 我不确定我是否在同一页面上;如果我需要创建一个带有值的 CustomClass 实例,那么我几乎失去了拖放中的所有值。我需要能够选择要拖动的图像,而不是预先填充它。 我不知道您的应用程序是如何设置的。但是您似乎想创建一个 CustomClass 的实例作为项目提供者。因此,您需要在创建NSItemProvider 时传入对现有CustomClass 实例的引用。该实例的来源取决于您和您的代码。但这正是我们所需要的。 我遇到了一个非常相似的问题,Xcode 告诉我它Cannot find 'self' in scope。但是我在实现相关协议的类中使用它。有什么快速的想法吗?

以上是关于参数类型“customClass.Type”不符合预期类型“NSItemProviderWriting”的主要内容,如果未能解决你的问题,请参考以下文章

参数类型 '[HKCategoryType?]' 不符合预期的类型 'Hashable'

Scala 类型参数不符合类型参数范围

参数类型 'SecretSpec' 不符合预期的类型 'Sequence'

参数类型 'Range<Int>' 不符合预期的类型 'Sequence' Swift3

推断类型参数[Boolean]不符合方法过滤器的类型参数bounds [T.

错误:类型参数“RoutesBloc”不符合“BlocBuilder”上类型变量“B”的绑定“BlocBase<S>”