2015-09-08 16 views
8

Mam framework (OS X) Objective-C, do którego chcę dodać niektóre rozszerzenia Swift i używam Xcode 7ß6 do pracy z tym. Istnieje klasa w ramach (nazwijmy go „Sample”) wdrożone w plikach „Sample.h” i „Sample.m” .. „Sample.h” zawiera:Jak rozszerzyć klasę Objective-C o Swift w framework?

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

.. a „Sample .m”zawiera:

#import "Sample.h" 

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

dodałem«Sample.swift»do ram zawierającego:

import Foundation 

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

jest to oczywiście trywialny wersja tego, co chcę robić w szerszym kontekście, tutaj Chcę użyć pliku Swift, aby rozszerzyć "Sample" o dodatek g Funkcja "PrettyPrint".

.. framework kompiluje się bezbłędnie, ale funkcja struktury "PrettyPrint" nie jest widoczna dla aplikacji wywołującej. Kod aplikacji poddawania w ramach takich jak:

import Foundation 
import TestKit 

let sample = Sample() 
sample.PrettyPrint() 

nie na „sample.PrettyPrint()” z: Wartość typu „próbka” ma człon „prettyprint”

Dlaczego to niepowodzeniem? i Czy to może działać?

Dodatkowe informacje: Jeśli usunę plik "Sample.swift" z frameworka i umieści go aplikację, która wywołuje strukturę, klasa "Sample" zostanie pomyślnie rozszerzona i "sample.PrettyPrint()" działa zgodnie z oczekiwaniami (druk "99").

Odpowiedz

9

Czy próbowałeś upublicznić rozszerzenie i funkcję?

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

@RamsayConsulting jeśli to zadziałało, powinieneś oznaczyć to jako odpowiedź – norepro

+3

To nie działa w Swift 3.0 Xcode 8.0 beta –

+0

To działa, po prostu upewnij się, aby zbudować swój projekt przed próbą uzyskania dostępu do szybkiego rozszerzenia w obj c. – Zeezer

0

W tym przykładzie, jeśli istnieje metoda w

Sample.m:

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

Jak można nazwać to z Sample.swift:

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

Czy byłeś w stanie znaleźć obejście, aby wywołać funkcję celu c w szybkim rozszerzeniu? –

Powiązane problemy