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

时间:2017-01-12 17:21:52

标签: 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
    }
}

想法?

1 个答案:

答案 0 :(得分:0)

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

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