0

我有一个混合项目,遇到了一个有趣的问题。有一个枚举,在 obj-c 中定义

typedef NS_ENUM (NSUInteger, ABCCategory) {
  ABCCategoryFirst,
  ABCCategorySecond
};

接下来,有一个 swift 文件,其中定义了扩展名

extension ABCCategory: RawRepresentable {

  public typealias RawValue = String

  public init(rawValue: RawValue) {
    switch rawValue {
    case "first":
      self = .first
    case "second":
      self = .second
    default:
      self = .first
    }
  }

  public var rawValue: RawValue {
    get {
      switch self {
      case .first:
        return "first"
      case .second:
        return "second"
      }
    }
  }
}

在 Debug 配置中一切正常,但是当我切换到 Release 时它不会构建,说:'rawValue' 的重新声明无效 我尝试删除 typealias,用 String 替换 RawValue(因此协议可以隐式猜测值),使构造函数在协议中是可选的(并且隐式展开的可选) - 不行。

我确实理解用字符串扩展 Int 枚举有点奇怪,但为什么它停止在 Release 中构建并在 Debug 中绝对完美地工作?

是否有一些不同的机制来处理发布配置的枚举/类/扩展?

4

1 回答 1

1

Swift 中枚举的原始值语法“只是”符合 RawRepresentable 协议的简写。如果您想使用其他不受支持的类型作为原始值,手动添加它很容易。 资源

我不确定它为什么在调试中起作用,因为当您创建类型化枚举时,您已经“符合” RawRepresentable. 因此,当您创建NS_ENUM它时,它会像这样导入到 swift 中:

public enum ABCCategory : UInt {
    case first
    case second
}

意味着它已经符合RawRepresentable. 修复可以通过两种方式实现,一种是在 Swift 中,另一种是在 Objective-C 中


在 Swift 中,我们只需删除RawRepresentable并更改rawValuestringValue,RawValueString:

extension ABCCategory {

    var stringValue: String {
        switch self {
        case .first: return "first"
        case .second: return "second"
        }
    }

    init(_ value: String) {
        switch value {
        case "first":
            self = .first
        case "second":
            self = .second
        default:
            self = .first
        }
    }

}

或者您可以将 Objective-C 更改为使用NS_TYPED_ENUM. 这里有一些信息。但是,这会将您的枚举更改为struct

。H

typedef NSString *ABCCategory NS_TYPED_ENUM;

extern ABCCategory const ABCCategoryFirst;
extern ABCCategory const ABCCategorySecond;

.m

ABCCategory const ABCCategoryFirst = @"first";
ABCCategory const ABCCategorySecond = @"second";

这将由 swift 导入,如下所示:

public struct ABCCategory : Hashable, Equatable, RawRepresentable {

     public init(rawValue: String)
}

public static let first: ABCCategory
public static let second: ABCCategory
于 2018-04-03T13:06:48.703 回答