参数类型“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'
参数类型 'SecretSpec' 不符合预期的类型 'Sequence'
参数类型 'Range<Int>' 不符合预期的类型 'Sequence' Swift3