Swift扩展"未找到方法定义"

时间:2014-06-20 13:49:00

标签: objective-c swift

我正在为我的ObjC课程编写Swift扩展程序。虽然我的代码编译完美,但我收到了一堆Xcode警告 (每个Swift方法一个):

  "Method definition for 'foo_method:' not found"
  "Method definition for 'bar_method:' not found"
  "Method definition for 'baz_method:' not found"

重现Xcode消息很简单。我用四行非样板代码制作了这个演示项目:

Objective-C(NSView的子类)

// Subclass_of_NSView.h

#import <Cocoa/Cocoa.h

@interface Subclass_of_NSView : NSView

@end


// Subclass_of_NSView.m

@implementation Subclass_of_NSView

- (instancetype)initWithFrame:(NSRect)frame
//______________^ WARNING: Method definition for resizeSubviewsWithOldSize: not found
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    }
    return self;
}

@end

Swift(扩展Obj-C子类)

// Extension_of_Subclass.swift

import Foundation

extension Subclass_of_NSView {

    override func resizeSubviewsWithOldSize( old_bounds_size:NSSize ) {

    }

}

桥接报头

// Demo_Project-Bridging-Header.h

#import "Subclass_of_NSView.h"

如果我这样做,我猜测警告就会消失:

a)在我的ObjC类的.m文件中创建一堆伪方法。

b)在我的Swift扩展中,扩展我的ObjC类的超类。

我不喜欢这些解决方案中的任何一个。

有没有更好的方法让编译器满意?

2 个答案:

答案 0 :(得分:2)

我不确定这里发生了什么,我认为这个问题与NSView如何与快速语言联系起来有关。

如果您要覆盖这些方法,请确保调用super实现,因为NSView可能会在没有它们的情况下突然发生。但是我不确定即使这是安全的,你仍然可能会中断NSView - 也许是错误发生的原因是因为Apple正在做一些奇怪/非标准的设置。

如果我是你,我会忍受编译器警告,并通过http://bugreport.apple.com向Apple报告问题。希望它将在未来的Xcode 6测试版中得到修复。

答案 1 :(得分:2)

这是一个老问题,但我仍然看到Xcode 7.3.1存在这个问题。

我无法看到Objctive-C中定义的公共函数的原因是因为我没有在桥接头文件的参数中包含所有类。有关更多详细信息,请参阅以下示例:

我在Objective-C中定义了类,如:

<强> foo.h中

@interface Foo : NSObject
- (void)function1;
- (void)function2:(Bar *)para; // here Bar is just another object
@end

<强> Foo.m

@implementation Foo
// ...
@end

在我的网桥标题中,我有#import "Foo.h"但不是#import "Bar.h"。因此,我可以从我的快速扩展程序中调用function1,但不能function2

<强> Foo.swift

extension Foo {
    func function3() {
         function1(); // Okay
         function2(nil); // Method definition not found
    }
}

因此,将#import "Bar.h"添加到网桥标头可以解决问题。