问题 如何在框架中使用Swift扩展Objective-C类?


我有一个(OS X)Objective-C框架,我想添加一些Swift扩展,我正在使用Xcode7ß6来处理这个问题。框架中有一个类(我们称之为“Sample”)在文件“Sample.h”和“Sample.m”中实现。“Sample.h”包含:

#import <Foundation/Foundation.h>
@interface Sample : NSObject
@property   int     x;
@end

..和“Sample.m”包含:

#import "Sample.h"

@implementation Sample
- (instancetype) init {
    if ((self = [super init]) == nil) return nil;
    self.x = 99;
    return self;
}
@end

我在框架中添加了“Sample.swift”,其中包含:

import Foundation

extension Sample {
    func PrettyPrint () {    
        print("\(x)")
    }
}

这显然是我想在更大的上下文中做的一个简单的版本,在这里我想通过添加“PrettyPrint”函数来使用Swift文件来扩展“Sample”。

..框架构建没有错误,但框架功能“PrettyPrint”对于调用应用程序是不可见的。调用框架的应用程序代码如:

import Foundation
import TestKit

let  sample = Sample()
sample.PrettyPrint()

使用“sample.PrettyPrint()”失败: “Sample”类型的值没有成员'PrettyPrint'

为什么这会失败? 和 可以使它工作吗?

额外信息:如果我从框架中删除文件“Sample.swift”并将其调用到框架中的应用程序,则“Sample”类成功扩展并且“sample.PrettyPrint()”按预期工作(打印“ 99" )。


3200
2017-09-08 22:14


起源



答案:


您是否尝试将扩展和功能公开?

public extension Sample {
    public func PrettyPrint () {    
        print("\(x)")
    }
}

12
2017-09-09 07:22



@RamsayConsulting如果这个有效,那么你应该把它标记为答案 - norepro
这不适用于Swift 3.0 Xcode 8.0 beta - Burhanuddin Sunelwala
它工作正常,只需确保在尝试访问obj c中的swift扩展之前构建项目。 - Zeezer


答案:


您是否尝试将扩展和功能公开?

public extension Sample {
    public func PrettyPrint () {    
        print("\(x)")
    }
}

12
2017-09-09 07:22



@RamsayConsulting如果这个有效,那么你应该把它标记为答案 - norepro
这不适用于Swift 3.0 Xcode 8.0 beta - Burhanuddin Sunelwala
它工作正常,只需确保在尝试访问obj c中的swift扩展之前构建项目。 - Zeezer


在这个例子中,如果有一个方法

Sample.m:

- (void)PrettyPrintObjC
{
    NSLog(@"This is from ObjC");
}

你如何从Sample.swift中调用它:

public extension Sample {
    public func PrettyPrint () {    
        print("\(x)")
        PrettyPrintObjC() // This does not work
    }
}

1
2017-11-25 00:58



您是否能够找到一种解决方法来在swift扩展中调用目标c函数? - Bushra Shahid