Uwaga: Rzeczy zmieniły się od czasu, kiedy ta odpowiedź została napisana po raz pierwszy - zobacz aktualizacje na końcu!
Tak, to robi szew być błąd ... choć, kontrolowanie Obj-C nazwy uruchomieniowe metod działa:
Say definiujemy parę minimalnych klas Obj-C i Swift, które współdziałają z siebie:
Foo.swift
import Foundation
@objc(SwiftFoo)
class Foo { // inheriting from NSObject makes no difference in this case
@objc(postcardFromSwift)
class func postcard() -> String {
return "Postcard from Swift!"
}
@objc(getMailInSwift)
class func getMail() {
if let hello = NSBar.postcard() { // NSBar is an Obj-C class (see below)
println("Printed in Swift: \(hello)")
}
}
}
NSBar.h
#import <Foundation/Foundation.h>
@interface NSBar : NSObject
+ (NSString *)postcard;
+ (void)getMail;
@end
NSBar.m
#import "NSBar.h"
#import "ObjS-Swift.h"
@implementation NSBar
+ (void)getMail {
// notice that I am not referring to SwiftFoo in spite of @objc(SwiftFoo)
printf("Printed in Objective C: %s", [[Foo postcardFromSwift] UTF8String]);
}
+ (NSString *)postcard {
return @"Postcard from Objective C!";
}
@end
Jeśli obecnie nazywamy ich metody klasy, powiedzmy, od main.m
:
#import <Cocoa/Cocoa.h>
#import "NSBar.h"
#import "ObjS-Swift.h"
int main(int argc, const char * argv[]) {
// notice that I am not referring to SwiftFoo in spite of @objc(SwiftFoo)
[Foo getMailInSwift];
[NSBar getMail];
return NSApplicationMain(argc, argv);
}
Drukuje następujące:
// --> Printed in Swift: Postcard from Objective C!
// --> Printed in Objective C: Postcard from Swift!
Ale to nie powinno mieć! Foo
powinien być widoczny tylko dla Obj-C jako SwiftFoo
, ponieważ jest to obiecująca opcja dla @objc(SwiftFoo)
. Rzeczywiście, użycie SwiftFoo
wyzwala błąd kompilatora Use of undeclared identifier
. Fakt, że działa to w przypadku nazw metod, nie pozostawia wątpliwości, że jest to błąd. Jestem zdumiony, że pierwszy o to pytasz! Plus jeden za to!
I tak:..
// <#ModuleName#>-Swift.h
SWIFT_CLASS("SwiftFoo")
@interface Foo
+ (NSString *)postcardFromSwift;
+ (void)getMailInSwift;
... czy szew być odwrócone przez nazwę klasy, ale to jest, jak to działa makro - zobacz wideo Swift Interoperability In Depth WWDC (C 45 min i 48 min do c wideo). Odpowiednia dokumentacja to Exposing Swift Interfaces in Objective-C.
Xcode 7 beta 4
Kwestia ta jest już ustalona (dzięki @ScottBerrevoets dla komentarzu).
Xcode 7,1
(dzięki @Pang za komentarz)
@objc class C { } // error: only classes that inherit from NSObject can be declared @objc
Czy rzeczywiście wypróbowane i nie udało się utworzyć instancji w Objective C jako 'NSFoo'? – milos
@milos Tak. Kompilator nie zgadza się z użyciem "Niezadeklarowanego identyfikatora" NSFoo "' – Manav
Tylko notatkę. Unikałbym używania już używanych prefiksów klas, takich jak NS, CA, UI, itp. ... – Fogmeister