您好我是Swift的新手,但对Objective-C有经验。 我有一个使用Swift和Objective-C文件(桥接和所有)的项目。
假设我有一个名为" fooProtocol"的协议。和一个班级" foo"实现它。我试图传递一个" fooProtocol"类型的对象。从Swift文件作为Objective-C文件内部函数的参数。
这里是class" tester"中的Objective-C函数:
-(void)setWithFoo:(id<fooProtocol>*)_foo{
}
这是Swift代码:
var myObject:fooProtocol = foo.init()
var objcObject:tester = tester.init()
objcObject.setWithFoo(_foo: myObject)
它首先说&#34;无法转换类型&#34; fooProtocol&#34;期望参数类型&#34; AutoreleasingUnsafeMutablePointer(显然因为它需要通过引用传递,所以...)
然后我尝试将参数转换为:
tester.setWithFoo(_foo: AutoreleasingUnsafeMutablePointer<fooProtocol>(myObject))
现在错误显示为:&#34;无法使用类型&#39;(fooProtocol)&#39;
的参数列表调用类型&#39; AutoreleasingUnsafeMutablePointer的初始值设定项我尝试了更多的排列和变体,但我根本无法阻止编译错误。对于这样一个简单的过程,如将多态变量传递给期望该协议ID的Objective-C文件中的函数,Swift使它成为一场噩梦。
...感谢任何帮助,谢谢!
===编辑===
以下是类的声明,现在可以使用大写
正确启动在&#34; FooProtocol.h&#34;文件:
@protocol FooProtocol
@end
在&#34; Foo.h&#34;文件:
#import <Foundation/Foundation.h>
#import "FooProtocol.h"
@interface Foo : NSObject <FooProtocol>
@end
在&#34; Foo.m&#34;:
#import "Foo.h"
@implementation Foo
@end
&#34; FooProtocol.h&#34;文件:
#import <Foundation/Foundation.h>
@protocol FooProtocol
@end
&#34; Tester.h&#34;文件:
#import <Foundation/Foundation.h>
#import "FooProtocol.h"
@interface Tester : NSObject
-(void)setWithFoo:(id<FooProtocol>*)_foo;
@end
&#34; Tester.m&#34;文件:
#import "Tester.h"
@implementation Tester
-(void)setWithFoo:(id<FooProtocol>*)_foo{
//do something with _foo
}
@end
再一次无法编译的Swift代码:
var myObject:FooProtocol = Foo.init()
var objcObject:Tester = Tester.init()
objcObject.setWithFoo(AutoreleasingUnsafeMutablePointer<FooProtocol>(myObject))
答案 0 :(得分:1)
你可能并不是故意这样说:
-(void)setWithFoo:(id<FooProtocol>*)_foo;
在Objective-C中看到id*
非常非常。事实上,在我多年编程Cocoa的过程中,我总是从未看过一个。
你可能是这个意思:
-(void)setWithFoo:(id<FooProtocol>)_foo;
然后你可以在Swift方面说:
objcObject.setWithFoo(myObject)