12

当我收到以下错误时,Swift 似乎无法识别 Objective-C-Header 中的 typedef:

无法从类型“MMDrawerControllerDrawerVisualStateBlock!”中找到用户定义的转换!输入“(MMDrawerController!,MMDrawerSide,CGFloat)-> Void”

我使用的是用 Objective-C 编写的MMDrawerController,但我自己的代码是用 Swift 编写的。

typedef 看起来像这样:

typedef void (^MMDrawerControllerDrawerVisualStateBlock)(MMDrawerController * drawerController, MMDrawerSide drawerSide, CGFloat percentVisible);

为了清楚起见,这里有更多代码片段:

AppDelegate.swift

func initDrawerController() {
    drawerController = MMDrawerController(centerViewController: centerController, leftDrawerViewController: leftDrawerController, rightDrawerViewController: rightDrawerController)
    drawerController?.setDrawerVisualStateBlock(MMDrawerVisualState.parallaxVisualStateBlockWithParallaxFactor(2.0))
}

MMDrawerController.h

typedef void (^MMDrawerControllerDrawerVisualStateBlock)(MMDrawerController * drawerController, MMDrawerSide drawerSide, CGFloat percentVisible);

@interface MMDrawerController : UIViewController
-(void)setDrawerVisualStateBlock:(void(^)(MMDrawerController * drawerController, MMDrawerSide drawerSide, CGFloat percentVisible))drawerVisualStateBlock;
@end

MMDrawerVisualState.h

@interface MMDrawerVisualState : NSObject
+(MMDrawerControllerDrawerVisualStateBlock)parallaxVisualStateBlockWithParallaxFactor:(CGFloat)parallaxFactor;
@end

模块-桥接-Header.h

#import "MMDrawerController.h"
#import "MMDrawerVisualState.h"

在构建这个时,我在我的 AppDelegate 中为 Expression with 收到一个错误setDrawerVisualStateBlock,尽管在 中有一个 typedef MMDrawerController.h

这是一个错误(因为在 Objective-C 上,它工作正常)?或者有没有人知道/知道如何处理它?非常感谢您的帮助,谢谢!

4

2 回答 2

3

Objective-C typedef 声明(例如在 MMDrawerController.h 中):

typedef NS_ENUM(NSInteger, MMDrawerOpenCenterInteractionMode) {
    MMDrawerOpenCenterInteractionModeNone,
    MMDrawerOpenCenterInteractionModeFull,
    MMDrawerOpenCenterInteractionModeNavigationBarOnly,
};

在 Swift 中,它是这样导入的:

enum MMDrawerOpenCenterInteractionMode: NSInteger {
    case None
    case Full
    case Only
}

所以你可以在 Swift 中使用这个语法:

var mmDrawerViewController:MMDrawerController! = ....... ;
mmDrawerViewController.centerHiddenInteractionMode = MMDrawerOpenCenterInteractionMode.Full;

使用 mmDrawerViewController.setDrawerVisualStateBlock() 试试

mmDrawerViewController.setDrawerVisualStateBlock{ (drawerController:MMDrawerController!, drawerSlide:MMDrawerSide!, cgFloat:CGFloat!) -> Void in
    println("setDrawerVisualStateBlock");
    ...
}
于 2014-09-11T14:28:24.127 回答
1

原因是您访问但可能没有导入桥接头MMDrawerSide drawerSide中声明的文件。MMDrawerSide

如果一个 Objective-C 方法声明访问了一个没有在你的桥接头中导入的类,Swift 不会导入也不会识别该方法。

因此,如果您在 Objective-C 中有一个 typedef,如下所示:

typedef void (^someBlock)(MMSomeClass *someInstance);

然后你必须确保MMSomeClass在你的桥接头中导入。

于 2015-10-07T18:29:45.893 回答