【发布时间】:2019-01-23 19:39:35
【问题描述】:
我已经看到很多关于在 Swift 中实现 Obj-C 协议的问题,但反之则不然,而且我还没有具体看到这一点。
我正在使用混合的 Obj-C / Swift 代码库。我有一个定义如下的 Swift 协议:
NamedItem.swift
@objc protocol NamedItem {
var name: String { get }
}
我有一个现有的 Objective-C 类,它目前有自己的 name 属性:
MyObjcClass.h
@interface MyObjcClass : NSObject
@property (nonatomic, strong, readonly) NSString* name;
@end
我有几个其他类具有name 属性,所以显然我想将它们都与协议相关联,而不是类型转换为一堆不同的类型。现在,如果我尝试将我的 Obj-C 类从拥有自己的属性切换到实现 Swift 协议:
MyObjcClass.h
@protocol MyObjcProtocol
@property (nonatomic, strong, readonly) NSString* place;
@end
@interface MyObjcClass : NSObject
@end
MyObjcClass.m
@interface MyObjcClass () <NamedItem>
@end
@implementation MyObjcClass
@synthesize name = _name;
@synthesize place = _place;
@end
这很好用,在我的其他 Objective-C 类中,但是如果我尝试从 Swift 类中访问名称属性:
SomeSwiftClass.swift
let myObj = MyObjcClass()
myObj.name // error
myObj.place // no problem
我收到以下错误:
“MyObjcClass”类型的值没有成员“name”
如果我不从MyObjcClass.h 中删除现有的@property 声明并省略@synthesize 声明,一切都会正确构建。这似乎很奇怪和错误 - 如果您从 Obj-C 类中采用 Objc-C 协议,则不必重新定义属性,只需 @synthesize 语句就足够了。
我已经尝试以我能想到的所有方式定义 Swift 协议,并且能够找到有关的建议,但我无法解决这个问题。
那么,在 Objective-C 类中实现 Swift 协议属性(可能特别是只读属性?)以使另一个 Swift 类可以访问它的正确方法是什么?我 真的 必须在 Obj-C 标头中重新声明该属性吗?我知道我总是可以放弃它并在 Objective-C 中定义协议,但是...... Swift 是未来! (或类似的东西......)
【问题讨论】:
标签: objective-c swift compiler-errors swift-protocols objective-c-swift-bridge