【问题标题】:Swift extension "Method definition not found"Swift 扩展“找不到方法定义”
【发布时间】:2014-08-11 07:18:22
【问题描述】:

我正在为我的 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 类的超类。

我不喜欢这两种解决方案。

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

【问题讨论】:

  • 你应该发布一些我认为的代码
  • 我截了一些截图。代码本身可能会令人困惑,因为可能涉及 4 个文件。
  • 我认为这是一个应该报告的错误
  • 我做了你说的一切,但无法重现问题:这个小演示应用程序编译得很好,没有任何警告。
  • @matt,它编译时可能没有实际的错误,但是我尝试过的两台机器(两个不同的项目都没有)编译时没有警告。我可以运行我的应用程序,但是看到几十个警告会让人分心 - 特别是如果有一个合法的警告隐藏在其中。

标签: objective-c swift


【解决方案1】:

我不确定这里发生了什么,我认为问题与 NSView 如何桥接到 swift 语言有关。

如果您要覆盖这些方法,请确保调用 super 实现,因为如果没有它们,NSView 可能会崩溃。但是我不确定这是否安全,您可能仍然会破坏 NSView — 可能发生错误的原因是因为 Apple 正在执行一些奇怪/非标准的设置。

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

【讨论】:

  • 我下载了最新的开发预览版。苹果修复了它。
【解决方案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"。因此,我可以从我的 swift 分机中调用 function1,但不能调用 function2

Foo.swift

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多