Ios 将可选的@objc枚举类型传递到@objc协议

Ios 将可选的@objc枚举类型传递到@objc协议,ios,swift,protocols,Ios,Swift,Protocols,我试图在@objc协议中创建一个可选函数,文档类型也是@objc enum。但我得到了一个错误: 方法无法标记为@objc,因为参数的类型无法更改 用Objective-C表示 我的源代码: @objc enum DocumentType: Int { case pdf case png } @objc protocol ImageDocumentEditorProtocol: class { @objc optional func imageDocumentEdito

我试图在@objc协议中创建一个可选函数,文档类型也是@objc enum。但我得到了一个错误:

方法无法标记为@objc,因为参数的类型无法更改 用Objective-C表示

我的源代码:

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

@objc protocol ImageDocumentEditorProtocol: class {
    @objc optional func imageDocumentEditorDidCancel(documentType: DocumentType?)
}
我如何解决这个问题?
谢谢

问题是

在Objective-C中,不能表示可选的基元类型


将其设置为非可选,或找到其他方法。

问题在于

在Objective-C中,不能表示可选的基元类型


将其设置为非可选,或找到另一种方法。

只需删除DocumentType上的可选项,即可实现以下功能:

@objc可选func imagedocumenteditorddcancel(documentType:documentType)

如果您想在此处使用表示nil值的内容,可以在枚举中为其添加另一个大小写,如下所示:

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

只需删除DocumentType上的可选项,即可实现以下功能:

@objc可选func imagedocumenteditorddcancel(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
s,您需要两种类型:

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

我添加了转换方法,以便于在它们之间进行转换,但技术上并不需要这些方法。

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

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

@objc enum DocumentType: Int {
    case pdf
    case png
    case none
}
并使用非可选类型
DocumentType

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

@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
    }
}
我添加了转换方法,使它们之间的转换更容易,但技术上并不需要它们