objective-c - 我们如何将一个可选的枚举值从 Swift 返回到 Obj-C?

标签 objective-c swift enums

我们知道如何将 Swift 枚举暴露给 Obj-C:

@objc enum Animal: Int {
    case Cat, Dog
}

但是编译器提示以下“无法在 Obj-C 中表示”:

func myAnimal() -> Animal? {
    if hasPet() {
         return .Cat
    } else {
         return nil
    }
}

想法?

最佳答案

Swift 中的可选 Int 不会映射到 Objective-C 中的类型。问题在于您的 myAnimal() 方法返回的类型无法在 Objective-C 中表示。

在我看来,您有两个选择...

选项 1:更改方法的返回类型:

func myAnimal() -> NSNumber? {
  // method body goes here.
}

这看起来不太好,因为在 Objective-C 中你必须做这样的事情:

if (myAnimal().integerValue == AnimalCat) {
  // do stuff here
}

选项 2:在您的枚举中添加一个包罗万象的案例

@objc enum Animal: Int {
  case none = 0
  case cat = 1
  case dog = 2

  init(rawValue: Int) {
    switch rawValue {
    case 1: self = Cat
    case 2: self = Dog
    default: self = None
    }
  }
}

// Updated method signature that makes the compiler happy.
func myAnimal() -> Animal {
  if hasPet() {
     return .Cat
  } else {
    return .None
  }
}

这样,您可以将方法签名更改为不返回可选值,编译器会很高兴。

关于objective-c - 我们如何将一个可选的枚举值从 Swift 返回到 Obj-C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41619304/

相关文章:

java - 如何在java中使用for或while方法调用枚举?

objective-c - 我该如何命名文件来为 NSString 创建类别?

iphone - 当我尝试以编程方式向 UIView 添加 Slider 时,如果宽度太高,它不会出现

iphone - 核心数据。 ExecuteFetchRequest 出现故障 NSManagedObject(不在 RAM 中)

ios - 修复了 UICollectionView 中的静态单元格

ios - 当我返回 TableViewController 时应用程序崩溃

javascript - 根据 TypeScript 中的字符串值属性对对象进行排序

ios - 使用 SwiftUI 从结构中的完成变量调用方法

swift - 在 swift 中使用非 NS_ENUM objective-C 枚举

java - 在遗留代码中访问私有(private)枚举