2015-09-08 3 views
8

У меня есть (OS X) Objective-C framework, к которому я хочу добавить некоторые расширения Swift, и я использую Xcode 7ß6 для работы с этим. Существует класс в рамках (давайте назовем это «образец») реализован в файлах «Sample.h» и «Sample.m» .. «Sample.h» содержит:Как расширить класс Objective-C с помощью Swift в рамках?

#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)") 
    } 
} 

Это явно тривиальный вариант того, что я хочу сделать в более широком контексте, здесь Я хочу использовать файл Swift для расширения «Sample» с помощью addin g a Функция «PrettyPrint».

.. framework строит без ошибок, но функция фреймворка «PrettyPrint» не отображается вызывающему приложению. App код вызова в рамки, как:

import Foundation 
import TestKit 

let sample = Sample() 
sample.PrettyPrint() 

терпит неудачу на "sample.PrettyPrint()" с: Значение типа 'Образец' не имеет ни одного члена 'PrettyPrint'

Почему это провал? и Можно ли заставить его работать?

Дополнительная информация: Если я удалю файл «Sample.swift» из фреймворка и поместил его в приложение, которое вызывается в фреймворк, класс «Sample» успешно расширен и «sample.PrettyPrint()» работает как ожидается (печать «99»).

ответ

9

Вы пытались сделать расширение и функцию общедоступными?

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

@RamsayConsulting если это сработало, тогда вы должны отметить это как ответ – norepro

+3

Это не работает в Swift 3.0 Xcode 8.0 beta –

+0

Это работает, просто убедитесь, что вы создали свой проект, прежде чем пытаться получить доступ к быстрым расширениям в obj c. – Zeezer

0

В этом примере, если есть способ в

Sample.m:

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

Как вы называете это от Sample.swift:

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

Вы могли найти обходное решение для вызова функции c в быстром расширении? –