【问题标题】:Passing optional @objc enum type into @objc protocol将可选的@objc 枚举类型传递给@objc 协议
【发布时间】:2020-07-08 05:33:54
【问题描述】:

我正在尝试在@objc 协议中创建一个可选函数,documentType 也是@objc 枚举。但我收到了这个错误:

方法不能被标记为@objc,因为参数的类型不能 用Objective-C表示

我的源代码:

@objc enum DocumentType: Int {
    case pdf
    case png
}

@objc protocol ImageDocumentEditorProtocol: class {
    @objc optional func imageDocumentEditorDidCancel(documentType: DocumentType?)
}

我该如何解决这个问题? 谢谢

【问题讨论】:

    标签: ios swift protocols


    【解决方案1】:

    Objective-C 没有可选的枚举。枚举必须是非可选的。类可以是可选的,而不是枚举 :(

    一种解决方法是添加一个案例:

    @objc enum DocumentType: Int {
        case pdf
        case png
        case none
    }
    

    并改用非可选类型DocumentType

    当然,这使得非可选的DocumentTypes 不可表示。要同时表示可选和非可选DocumentTypes,您需要两种类型:

    @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
        }
    }
    

    我添加了转换方法,以便于在它们之间进行转换,但它们在技术上不是必需的。

    【讨论】:

      【解决方案2】:

      问题是?

      在 Objective-C 中,您不能表示原始类型的 Optional。

      使它成为非可选的,或者找到其他方式。

      【讨论】:

        【解决方案3】:

        只需删除 DocumentType 上的可选项,因此函数将是:

        @objc optional func imageDocumentEditorDidCancel(documentType: DocumentType)

        如果你想在这里有代表 nil 值的东西,你可以像这样在枚举中添加另一个案例:

        @objc enum DocumentType: Int {
            case pdf
            case png
            case none
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-22
          • 1970-01-01
          • 2014-07-31
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          相关资源
          最近更新 更多