[英]Passing optional @objc enum type into @objc protocol
我正在嘗試在@objc 協議中創建一個可選的 function,documentType 也是@objc 枚舉。 但我收到了這個錯誤:
方法不能標記@objc,因為Objective-C中不能表示參數的類型
我的源代碼:
@objc enum DocumentType: Int {
case pdf
case png
}
@objc protocol ImageDocumentEditorProtocol: class {
@objc optional func imageDocumentEditorDidCancel(documentType: DocumentType?)
}
我該如何解決這個問題? 謝謝
問題是?
.
在 Objective-C 中,您不能表示原始類型的 Optional。
使它成為非可選的,或者找到另一種方式。
只需刪除 DocumentType 上的可選項,因此 function 將是:
@objc optional func imageDocumentEditorDidCancel(documentType: DocumentType)
如果你想在這里有代表 nil 值的東西,你可以在枚舉中為它添加另一個案例,如下所示:
@objc enum DocumentType: Int {
case pdf
case png
case none
}
Objective-C 沒有可選的枚舉。 枚舉必須是非可選的。 類可以是可選的,而不是枚舉:(
一種解決方法是添加一個案例:
@objc enum DocumentType: Int {
case pdf
case png
case none
}
並改用非可選類型DocumentType
。
當然,這使得非可選DocumentType
s 不可表示。 要同時表示可選和非可選DocumentType
,您需要兩種類型:
@objc enum DocumentType: Int {
case pdf
case png
func asOptionalDocumentType() -> OptionalDocumentType {
switch self {
case .pdf: return .pdf
case .png: return .png
}
}
}
extension Optional where Wrapped == DocumentType {
func asOptionalDocumentType() -> OptionalDocumentType {
self?.asOptionalDocumentType() ?? .none
}
}
@objc enum OptionalDocumentType: Int, ExpressibleByNilLiteral {
case pdf
case png
case none
func asDocumentType() -> DocumentType? {
switch self {
case .pdf: return .pdf
case .png: return .png
case .none: return nil
}
}
init(nilLiteral: ()) {
self = .none
}
}
我添加了轉換方法,以便在它們之間輕松轉換,但它們在技術上不是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.