【问题标题】:How to access Swift class-level enum from Objective-C code如何从 Objective-C 代码访问 Swift 类级枚举
【发布时间】:2015-06-16 17:32:53
【问题描述】:

我正在重写,我正处于将我的核心数据模型转换为 Swift 的阶段。一个这样的模型,PointOfInterest 包含一个称为 typesenum,用于识别对象的 PointOfInterest 类型是:

@class Port;

@interface PointOfInterest : NSManagedObject

enum types {
    kGeneral,
    kRestaurant,
    kTypeCount
};

@property (nonatomic, retain) NSNumber * averageRating;
@property (nonatomic, retain) NSString * city;
@property (nonatomic, retain) NSString * countryName;
@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSString * imageURL;
@property (nonatomic, retain) NSNumber * latitude;
@property (nonatomic, retain) NSNumber * longitude;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * phone;
@property (nonatomic, retain) NSString * postalCode;
@property (nonatomic, retain) NSString * priceLevel;
@property (nonatomic, retain) NSNumber * rankingNumber;
@property (nonatomic, retain) NSString * rankingString;
@property (nonatomic, retain) NSString * state;
@property (nonatomic, retain) NSString * street1;
@property (nonatomic, retain) NSString * street2;
@property (nonatomic, retain) NSNumber * totalReviews;
@property (nonatomic, retain) NSNumber * type;
@property (nonatomic, retain) NSString * webURL;
@property (nonatomic, retain) NSSet *ports;
@end

@interface PointOfInterest (CoreDataGeneratedAccessors)

- (void)addPortsObject:(Port *)value;
- (void)removePortsObject:(Port *)value;
- (void)addPorts:(NSSet *)values;
- (void)removePorts:(NSSet *)values;

@end

在 Swift 中,代码如下所示:

// PointOfInterest.swift

class PointOfInterest: NSManagedObject {
    @NSManaged var averageRating: NSNumber
    @NSManaged var city: String
    @NSManaged var countryName: String
    @NSManaged var id: NSNumber
    @NSManaged var imageURL: String
    @NSManaged var latitude: NSNumber
    @NSManaged var longitude: NSNumber
    @NSManaged var name: String
    @NSManaged var phone: String
    @NSManaged var postalCode: String
    @NSManaged var priceLevel: String
    @NSManaged var rankingNumber: NSNumber
    @NSManaged var rankingString: String
    @NSManaged var state: String
    @NSManaged var street1: String
    @NSManaged var street2: String
    @NSManaged var totalReviews: NSNumber
    @NSManaged var type: NSNumber
    @NSManaged var webURL: String
    @NSManaged var ports: NSSet

}

包含enum 的扩展名位于不同的文件中(我重命名了enum 值)

// PointOfInterest+Helpers.swift
extension PointOfInterest
{
    @objc enum Types:Int
    {
        case General
        case Restaurant
        case TypeCount
    }

}

在我最初的 Objective-C 视图之一中,我有以下一行(以及其他几行,但我们将专注于这一行,因为它们都有相同的错误),这会产生错误:Semantic issue: Use of undeclared identifier 'kGeneral'

poi.type = [NSNumber numberWithInt: kGeneral];

即使我将kGeneral 更改为General 甚至TypesGeneral,似乎也无法从PointOfInterest 访问此enum 值。 this question 的答案没有帮助。

所以我的问题是:如何从 Objective-C 代码中检索 Swift 类级别 enum 的值?

【问题讨论】:

    标签: ios objective-c swift


    【解决方案1】:

    如何从 Objective-C 代码中检索 Swift 类级枚举的值

    你不能。 Objective-C 没有将枚举视为“在”另一个类“内部”的概念。如果您希望 Objective-C 能够看到它,请将枚举放在顶层。

    【讨论】:

    • 您能否详细说明“顶级”是什么意思?对 Swift 来说还是相当新的,而且一些术语仍然是陌生的。
    • 不要把它放在类的扩展中。只需在任何 Swift 文件的顶层定义它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多