Objective c 从另一个Swift类访问Obj-C类中实现的Swift协议属性
我已经看到了很多关于在Swift中实现Obj-C协议的问题,但没有看到太多相反的问题,我也没有具体看到这一点 我使用的是混合的Obj-C/Swift代码库。我的Swift协议定义如下: NamedItem.swiftObjective c 从另一个Swift类访问Obj-C类中实现的Swift协议属性,objective-c,swift,compiler-errors,swift-protocols,objective-c-swift-bridge,Objective C,Swift,Compiler Errors,Swift Protocols,Objective C Swift Bridge,我已经看到了很多关于在Swift中实现Obj-C协议的问题,但没有看到太多相反的问题,我也没有具体看到这一点 我使用的是混合的Obj-C/Swift代码库。我的Swift协议定义如下: NamedItem.swift @objc protocol NamedItem { var name: String { get } } let myObj = MyObjcClass() myObj.name // error myObj.place // no problem @objc pro
@objc protocol NamedItem {
var name: String { get }
}
let myObj = MyObjcClass()
myObj.name // error
myObj.place // no problem
@objc protocol NamedObject {
var name: String { get }
}
let myObj = MyObjcClass()
myObj.asNamedItem.name
我有一个现有的Objective-C类,它当前有自己的名称属性:
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
@protocol NamedItem;
@interface MyObjcClass : NSObject
- (id<NamedItem>)asNamedItem;
@end
MyObjcClass.m
@interface MyObjcClass () <NamedItem>
@end
@implementation MyObjcClass
@synthesize name = _name;
@synthesize place = _place;
@end
@interface MyObjcClass () <NamedItem>
@synthesize name = _name;
- (id<NamedItem>)asNamedItem
{
return self;
}
@end
我得到以下错误:
“MyObjcClass”类型的值没有成员“name”
如果我不从MyObjcClass.h
中删除现有的@属性
声明,并省略@synthesis
语句,则所有内容都会正确生成。这似乎有些奇怪和错误-如果您采用来自Obj-C类的Objc-C协议,则不必重新定义属性,只需使用@synthesis
语句即可
我试着用我所能想到的每一种方式来定义Swift协议,并且能够找到关于它的建议,但我一直无法回避这个问题
那么,在Objective-C类中实现Swift协议属性(可能是只读属性?)的正确方法是什么,以便另一个Swift类可以访问它?我真的必须在Obj-C头中重新声明属性吗?我知道我可以放弃它,用Objective-C定义协议,但是。。。斯威夫特是未来!(或类似的事情…)
编译得很好。好的,通过和博客文章中的一些建议获得了一个有效的解决方案
现在的类如下所示:
NamedItem.swift
@objc protocol NamedItem {
var name: String { get }
}
let myObj = MyObjcClass()
myObj.name // error
myObj.place // no problem
@objc protocol NamedObject {
var name: String { get }
}
let myObj = MyObjcClass()
myObj.asNamedItem.name
MyObjcClass.h
@protocol MyObjcProtocol
@property (nonatomic, strong, readonly) NSString* place;
@end
@interface MyObjcClass : NSObject
@end
@protocol NamedItem;
@interface MyObjcClass : NSObject
- (id<NamedItem>)asNamedItem;
@end
没有我希望的那么干净,但这比一堆警告或承认失败并用Objective-C重新编写协议要好(我不知道,也许不是……但这就是我所做的)
希望这能帮助别人。不。我试过了,但不幸的是,这并没有改变任何事情。得到的只是一个响亮的警告“找不到‘MySwiftProtocol’的协议定义”,如果“导入“-Swift.h”(不应该在标题中执行),警告消失,但原始错误仍然存在。将MyProject Swift.h标题导入到类标题中。确定,找到解决方案。您的MyObjcClass()作为NamedItem
是关键线索。所以,首先,从技术上讲,您可以转发一致性声明协议(这是一个警告而不是错误),但我当然不喜欢这样。我找到了这个帖子()。作者在底部提供了一个聪明的(不是完美的)解决方案,我同意。“仍然感觉像一个快速的bug”。顺便说一句,你应该可以将你的完整解决方案作为自己的答案发布。很有趣,谢谢你发布你的想法!(如果您愿意,也可以毫不犹豫地将其标记为已接受的答案。)