2

我試圖讓Objective-C類採用一個用Swift文件編寫的協議。我有Swift Objective-C在一定程度上互操作。 (我可以從Swift構建我的Objective-C類)。無法將符合協議的Objective-C類分配給使用Swift協議的屬性

我:

@objc public protocol FooProtocol { 
    func foobar() 
} 

然後,我的Objective-C的文件:

#import <UIKit/UIKit.h> 
#import "SwiftObjcProtocolTest-Bridging-Header.h" 

@protocol FooProtocol 
@end 

@interface ObjClass1 : NSObject <FooProtocol> 

-(void)foobar; 

@end 

並實現了一套:

#import "ObjClass1.h" 

@implementation ObjClass1 

- (void)foobar { 
    NSLog(@"foobar protocol function called"); 
} 

@end 

但是,當我給斯威夫特(主要是在應用程序這樣做委託)委託屬性並嘗試將Objective-C對象分配給它:

var delegate: FooProtocol? 
.... 
delegate = objcInstance 
delegate?.foobar() 

它失敗: '?FooProtocol'

不能分配型 'ObjClass1' 的值輸入。

我試過用as! FooProtocol強迫它,但是這會導致SIGABRT。

這裏有什麼問題?

+0

什麼,如果你完全刪除頭文件中的協議定義? –

回答

0

爲了得到這個工作,我發現:

  1. 確保導入您的銀行代碼到的Objective-C(see here)。將其導入ObjClass1.m
  2. 你的協議FooProtocol的向前聲明應該是這樣的:

    @protocol FooProtocol; 
    

代替:

@protocol FooProtocol 
    @end 

注:雖然這個工作對我來說,有可能是一個更好的解決方案在那裏,因爲我在ObjClass1.h中發出警告Cannot find protocol definition for 'FooProtocol'

+1

我得到了你提到過的兩次警告(警告重複向我表明Xcode不會因爲我的設置而下降)。也。我得到'I_OBJC_PROTOCOL _ $ _ FooProtocol,引用:'而沒有。 'linker命令失敗並退出代碼(-v for more ..)'。奇怪的是,點擊這些錯誤甚至沒有把我帶到更多的信息進一步表明一些東西是錯誤的或不設置在這裏。 –