簡體   English   中英

將可選的 @objc 枚舉類型傳遞給 @objc 協議

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM