Swift不从Objective-C Header导入typedef

boe*_*qsh 10 typedef objective-c ios swift mmdrawercontroller

似乎Swift无法识别Objective-C-Header中的typedef,因为我得到以下错误:

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

我使用的是用Objective-C编写的MMDrawerController,我自己的代码虽然在Swift中.

typedef如下所示:

typedef void (^MMDrawerControllerDrawerVisualStateBlock)(MMDrawerController * drawerController, MMDrawerSide drawerSide, CGFloat percentVisible);
Run Code Online (Sandbox Code Playgroud)

为清晰起见,这里有更多代码段:

AppDelegate.swift

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

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
Run Code Online (Sandbox Code Playgroud)

MMDrawerVisualState.h

@interface MMDrawerVisualState : NSObject
+(MMDrawerControllerDrawerVisualStateBlock)parallaxVisualStateBlockWithParallaxFactor:(CGFloat)parallaxFactor;
@end
Run Code Online (Sandbox Code Playgroud)

模块桥接-Header.h

#import "MMDrawerController.h"
#import "MMDrawerVisualState.h"
Run Code Online (Sandbox Code Playgroud)

构建这个时,我的AppDelegate中出现了一个表达式错误setDrawerVisualStateBlock,尽管在下面有一个typedef MMDrawerController.h:

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

Mao*_*Mao 3

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

\n\n
typedef NS_ENUM(NSInteger, MMDrawerOpenCenterInteractionMode) {\n    MMDrawerOpenCenterInteractionModeNone,\n    MMDrawerOpenCenterInteractionModeFull,\n    MMDrawerOpenCenterInteractionModeNavigationBarOnly,\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Swift 中,它\xe2\x80\x99 像这样导入:

\n\n
enum MMDrawerOpenCenterInteractionMode: NSInteger {\n    case None\n    case Full\n    case Only\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
var mmDrawerViewController:MMDrawerController! = ....... ;\nmmDrawerViewController.centerHiddenInteractionMode = MMDrawerOpenCenterInteractionMode.Full;\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用 mmDrawerViewController.setDrawerVisualStateBlock()\n尝试

\n\n
mmDrawerViewController.setDrawerVisualStateBlock{ (drawerController:MMDrawerController!, drawerSlide:MMDrawerSide!, cgFloat:CGFloat!) -> Void in\n    println("setDrawerVisualStateBlock");\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 是的,但你不能使用像“MMDrawerVisualState.swingingDoorVisualStateBlock()”这样的默认块 (4认同)