Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从另一个Swift类访问Obj-C类中实现的Swift协议属性_Objective C_Swift_Compiler Errors_Swift Protocols_Objective C Swift Bridge - Fatal编程技术网

Objective c 从另一个Swift类访问Obj-C类中实现的Swift协议属性

Objective 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

我已经看到了很多关于在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 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”。顺便说一句,你应该可以将你的完整解决方案作为自己的答案发布。很有趣,谢谢你发布你的想法!(如果您愿意,也可以毫不犹豫地将其标记为已接受的答案。)