Swift不能将符合协议的类作为函数参数传递给驻留在Objective-C文件中的函数

时间:2016-03-26 22:26:37

标签: objective-c swift function parameters protocols

您好我是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))

1 个答案:

答案 0 :(得分:1)

你可能并不是故意这样说:

-(void)setWithFoo:(id<FooProtocol>*)_foo;

在Objective-C中看到id*非常非常。事实上,在我多年编程Cocoa的过程中,我总是从未看过一个。

你可能是这个意思:

-(void)setWithFoo:(id<FooProtocol>)_foo;

然后你可以在Swift方面说:

objcObject.setWithFoo(myObject)