gpt4 book ai didi

objective-c - 发布版本中 rawValue 的重新声明无效

转载 作者:行者123 更新时间:2023-11-30 11:37:05 24 4
gpt4 key购买 nike

我有一个混合项目,遇到了一个有趣的问题。有一个枚举,在 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"
}
}
}
}

在调试配置中一切正常,但是当我切换到发布时它不会构建,并显示:“rawValue”的重新声明无效我尝试过删除类型别名,用 String 替换 RawValue (因此协议(protocol)可以隐式猜测该值),使构造函数像协议(protocol)中那样可选(并且也隐式解包可选) - 不行。

我确实知道用字符串扩展 Int 枚举有点奇怪,但为什么它停止在发布中构建并在调试中绝对完美地工作?

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

最佳答案

The raw value syntax for enums in Swift is “just” a shorthand for conformance to the RawRepresentable protocol. It’s easy to add this manually if you want to use otherwise unsupported types as raw values. Source

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

public enum ABCCategory : UInt {
case first
case second
}

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

<小时/>

在 Swift 中,我们只需删除 RawRepresentable 并将 rawValue 更改为 stringValue,将 RawValue 更改为 字符串:

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。一些信息 here 。但是,这会将您的枚举更改为 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

关于objective-c - 发布版本中 rawValue 的重新声明无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49629997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com