ObjC中使用的框架中的Swift委托协议

时间:2017-09-21 09:23:27

标签: objective-c swift frameworks delegates protocols

我在swift 3.2代码中编写的委托协议存在问题,包含在ObjC应用程序中包含的框架中。 这是初始代码

MyDelegate.swift

public protocol MyDelegate : class {
    func viewDidClose(_ view: MyView)
    func viewDidFail(_ view: MyView, error: MyError)
}

MyView.swift

import UIKit

public class MyView: UIView {
    weak open var delegate: MyDelegate?
    ...
}

public enum MyError: Error, LocalizedError {
    case noError
    case error1
    case error2

    public var errorDescription: String? {
        switch self {
        case .noError:
            return "No error occurred"
        case .error1:
            return "Error 1"
        case .error2:
            return "Error 2"
    }
}

在框架中包含此代码,生成的Module-Swift.h自动生成的头文件不包含委托属性,协议和错误。

根据一些建议,我在协议声明中添加了@objc,在错误枚举中添加Int作为第一种类型

@objc public protocol MyDelegate : class {
...
}

@objc public enum MyError: Int, Error, LocalizedError {
...
}

现在框架头正确地呈现了委托属性,委托协议定义和MyError声明,如下所示

MyView的-Swift.h

...

@protocol MyDelegate;
@class NSCoder;

SWIFT_CLASS("_TtC12MyView12MyView")
@interface MyView : UIView
@property (nonatomic, weak) id <MyDelegate> _Nullable delegate;
...
@end

@interface MyView (SWIFT_EXTENSION(MyView))
@end

enum MyError : NSInteger;

SWIFT_PROTOCOL("_TtP12MyView20MyDelegate_")
@protocol MyDelegate
- (void)viewDidClose:(MyView * _Nonnull)myView;
- (void)viewDidFail:(MyView * _Nonnull)myView error:(enum MyError)error;
@end

typedef SWIFT_ENUM(NSInteger, MyError) {
    MyErrorNoError = 0,
    MyError1 = 1,
    MyError2 = 2
};
static NSString * _Nonnull const MyErrorDomain = @"MyView.MyError";

@interface UIDevice (SWIFT_EXTENSION(MyView))
@property (nonatomic, readonly, copy) NSString * _Nonnull identifier;
@end

在一个快速的测试项目中,一切仍然正常。

在使用框架的ObjC应用程序中,一切正常(我可以按预期实例化和使用MyView)但是当我使用

设置委托属性时
@import MyView;
...
self.myView = [[MyView alloc] initWithFrame:frame];
self.myView.delegate = self;

应用程序在运行时崩溃(它编译没有任何问题)

-[MyView.MyView setDelegate:]: unrecognized selector sent to instance 0x7f9d82d2fc10
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyView.MyView setDelegate:]: unrecognized selector sent to instance 0x7f9d82d2fc10'

我无法弄清楚这个问题的原因是什么

更新:已解决

我发现解决方案通过了swift 4自动代码更新。 我只需要在 MyView.swift 文件

上的委托属性上添加@bjc
@objc weak open var delegate: MyDelegate?

0 个答案:

没有答案