Nie można używać klas Swift w Objective-C

260

Próbuję zintegrować Swiftkod z moją aplikacją, moja aplikacja jest napisana Objective-Ci dodałem Swiftklasę. Zrobiłem wszystko, co tu opisano . Ale moim problemem jest to, Xcodeże nie utworzyłem -Swift.hpliku, a jedynie nagłówki łączące. Więc go stworzyłem, ale tak naprawdę jest pusty. Mogę używać wszystkich moich klas ObjC w Swift, ale nie mogę tego zrobić na odwrót. Zaznaczyłem moją szybką klasę, @objcale to nie pomogło. Co mogę teraz zrobić?

EDYCJA: Apple mówi: „Kiedy importujesz kod Swift do Celu-C, polegasz na Xcode-generatedpliku nagłówkowym, aby udostępnić te pliki Celowi-C. [...] Nazwą tego nagłówka jest nazwa modułu produktu, a następnie dodanie„ -Swift.h ”.”

Teraz, gdy chcę zaimportować ten plik, pojawia się błąd:

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

Oto mój plik FBManager.swift:

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}
dnnagy
źródło
27
YourProjectName-Swift.hpowinien być magicznym plikiem nagłówkowym, który Xcode automatycznie tworzy dla ciebie podczas kompilacji (tak naprawdę nie zobaczysz go w przeglądarce projektu). Spróbuj usunąć utworzony i dodaj #import YourProjectName-Swift.hdo plików, w których chcesz użyć klas Swift.
Greg
3
Czy twoja aplikacja, którą tworzysz, nazywa się myProjectModule? -Swift.hPlik powinien zaczynać się od nazwy aplikacji. Czy masz plik z rozszerzeniem -Bridging-Header.h? Powinieneś. Jeśli tak, pierwszą częścią tego pliku jest nazwa twojego projektu. Połącz pierwszą część tej nazwy pliku z -Swift.htym, co powinieneś dołączyć.
vacawama
4
Mam to z powodzeniem działające w moim projekcie, a jednak -Swift.hna moim komputerze Mac nie ma żadnego rzeczywistego pliku , który mógłbym znaleźć, a jednak mogę go dołączyć. Więc nie rozłączaj się, szukając takiego pliku. Upewnij się tylko, że nazywasz go poprawnie.
vacawama
2
@vacawama Zauważ, że możesz zobaczyć zawartość po dodaniu instrukcji importu do pliku Objective-C poprzez kliknięcie importu z wciśniętym klawiszem Command, jakbyś odwiedzał inny plik nagłówka.
Kendall Helmstetter Gelner
4
Musiałem użyć#import <MyProjectName/MyProjectName-Swift.h>
Oliver Pearmain

Odpowiedzi:

516

Spędziłem około 4 godzin próbując włączyć Swiftw moim Xcodeprojekcie opartym na Objective-C. Mój myproject-Swift.hplik został pomyślnie utworzony, ale mój Xcodego nie widział Swift-classes. Postanowiłem więc stworzyć nowy Xcodeprojekt oparty na Objc i wreszcie znalazłem właściwą odpowiedź! Mam nadzieję, że ten post pomoże komuś :-)

Krok po kroku Szybka integracja dla projektu opartego na Xcode Objc:

  1. Utwórz nowy *.swiftplik (w Xcode) lub dodaj go za pomocą Findera.
  2. Utwórz, Objective-C bridging headergdy Xcode zapyta cię o to.
  3. Zaimplementuj swoją klasę Swift:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. Otwórz Ustawienia kompilacji i sprawdź następujące parametry:

    • Definiuje moduł: YES

      Skopiuj i wklej nazwę parametru w pasku wyszukiwania

    • Nazwa modułu produktu: myproject

      Upewnij się, że nazwa modułu produktu nie zawiera żadnych znaków specjalnych

    • Zainstaluj nagłówek zgodności Objective-C: YES

      Po dodaniu *.swiftpliku do projektu ta właściwość pojawi się w Ustawieniach kompilacji

    • Nagłówek interfejsu wygenerowany w Objective-C: myproject-Swift.h

      Ten nagłówek jest generowany automatycznie przez Xcode

    • Nagłówek mostkujący Cel-C: $(SRCROOT)/myproject-Bridging-Header.h
  5. Zaimportuj nagłówek interfejsu Swift do pliku * .m.

    #import "myproject-Swift.h"

    Nie zwracaj uwagi na błędy i ostrzeżenia.

  6. Oczyść i odbuduj swój projekt Xcode.
  7. Zysk!
sig
źródło
2
Czy ktoś widział wzmiankę o wymaganej konfiguracji (przynajmniej dla mnie) w dokumentacji na stronie: developer.apple.com/library/prerelease/ios/documentation/Swift/... w kroku 4 powyżej? Jeśli tak, przegapiłem to. Dzięki @sig.
Morkrom,
2
Mój problem był znacznie prostszy - nie mogłem znaleźć pliku, "myproject-Swift.h"więc wydaje mi się, że nie działa. Najwyraźniej ten plik nie jest widoczny w nawigatorze projektu.
Asaf
6
@Asaf Właściwie tak, ten plik jest automatycznie generowany przez Xcode i znajduje się na ścieżce kompilacji projektu. Możesz więc znaleźć ten plik ręcznie w Finderze / Konsoli lub otworzyć go bezpośrednio w Xcode za pomocą Cmd + LeftClick on #import "myproject-Swift.h".
podpis
1
Jak dla mnie # 5 wystarczyło, aby naprawić problem !!
skywinder
12
Dzięki tym 4 godzinom zaoszczędziłeś setki naszych godzin, wielkie dzięki :) Zapisane w moim ulubionym;)
Abo3atef
65

Nie twórz samodzielnie pliku nagłówka. Usuń ten, który utworzyłeś.

Upewnij się, że twoje klasy Swift są oznaczone @objclub dziedziczą po klasie, która wywodzi się (bezpośrednio lub pośrednio) NSObject.

Xcode nie wygeneruje pliku, jeśli masz jakieś błędy kompilatora w swoim projekcie - upewnij się, że projekt buduje się poprawnie.

Rachunek
źródło
8
kluczem było dla mnie budowanie. Nie można zbudować, ponieważ nie można znaleźć mojego pliku -swift.h, ale nie można znaleźć mojego pliku -swift.h, ponieważ nie można go zbudować: /
anders
13
@ i podczas uwięzienia w tym cyklu, możesz użyć, find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -uaby sprawdzić, czy plik został utworzony z nieoczekiwaną nazwą, jak dla mnie. :)
CodeReaper,
38

Pozwól Xcode wykonać swoją pracę, nie dodawaj / nie twórz ręcznie nagłówka Swift. Wystarczy dodać @objc przed klasą Swift ex.

@objc class YourSwiftClassName: UIViewController

W ustawieniach projektu wyszukaj poniższe flagi i zmień je na TAK (zarówno Projekt, jak i Cel)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

Następnie wyczyść projekt i skompiluj raz, po pomyślnej kompilacji (prawdopodobnie powinno) zaimportuj poniżej pliku nagłówka do pliku .m klasy Goal-c

#import "YourProjectName-Swift.h" 

Boooom!

Bharat Modi
źródło
1
Dzięki, to było fantastycznie proste i rozwiązało mój problem.
Felipe
Nie widzę żadnej z tych opcji w Ustawieniach kompilacji (Xcode 7.3.1). Co powinienem zrobić?
iosdude
1
^ Gdyby przełącznik od Basicsię Allw górnym pasku.
iosdude
1
Embedded Content Contains Swiftzostał zmieniony na Always Embed Swift Standard LibrariesXcode 8: stackoverflow.com/questions/38792650/…
William Grand
@WilliamGrand Dzięki za sugestię, zaktualizowałem odpowiedź.
Bharat Modi
28

Prawdopodobnie pomocne również dla tych z was, którzy mają cel Framework :

Instrukcja importu automatycznie generowanego pliku nagłówkowego wygląda nieco inaczej niż cele aplikacji. Oprócz innych rzeczy wymienionych w innych odpowiedziach użyj

#import <ProductName/ProductModuleName-Swift.h>

zamiast

#import "ProductModuleName-Swift.h"

zgodnie z dokumentacją Apple na temat Mix & Match dla celów ramowych.

Jeehut
źródło
1
@dinesharjani Cieszę się, że mogłem pomóc! :)
Jeehut
Co z celami w pakiecie?
Iulian Onofrei
14

Upewnij się, że Twój projekt definiuje moduł i że nadałeś mu nazwę. Następnie przebuduj, a Xcode utworzy -Swift.hplik nagłówka i będziesz mógł zaimportować.

Możesz ustawić definicję i nazwę modułu w ustawieniach projektu.

Leo Natan
źródło
14

Szczegóły: Projekt Objective-C z kodem Swift 3 w Xcode 8.1

Zadania:

  1. Użyj szybkiego wyliczenia w klasie celu c
  2. W trybie szybkim używaj enu celu-c

PEŁNA PRÓBKA

1. Klasa Objective-C, która wykorzystuje szybkie wyliczanie

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;
            
        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

Wykryj kod Swift w kodzie Objective-C

W mojej próbce używam SwiftCode.h do wykrycia kodu Swift w Objective-C. Ten plik generuje się automatycznie (nie utworzyłem fizycznej kopii tego pliku nagłówka w projekcie) i możesz ustawić tylko nazwę tego pliku:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Jeśli kompilator nie może znaleźć pliku Swift kodu nagłówka, spróbuj skompilować projekt.

2. Szybka klasa wykorzystująca wyliczenie celu C

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {
    
    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }
    
    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")
            
        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }
        
    }
}

Wykryj kod celu C w kodzie Swift

Musisz utworzyć mostkowy plik nagłówkowy. Gdy dodasz plik Swift w projekcie Objective-C lub plik Objective-C w swift projektu, Xcode zasugeruje utworzenie nagłówka pomostowego.

wprowadź opis zdjęcia tutaj

Tutaj możesz zmienić nazwę pliku nagłówka pomostowego:

wprowadź opis zdjęcia tutaj

Bridging-Header.h

#import "ObjcClass.h"

Stosowanie

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

Wynik

wprowadź opis zdjęcia tutaj


WIĘCEJ PRÓBEK

Kroki pełnej integracji Cel-c i Swift opisane powyżej . Teraz napiszę kilka innych przykładów kodu.

3. Wywołaj klasę Swift z kodu Celu-c

Szybka klasa

import Foundation

@objc
class SwiftClass:NSObject {
    
    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }
    
    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }
    
    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }
    
}

Kod celu C (kod wywołujący)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

Wynik

wprowadź opis zdjęcia tutaj

4. Wywołaj klasę Objective-c z kodu Swift

Klasa Objective-C (ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

Szybki kod (kod wywołujący)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

Wynik

wprowadź opis zdjęcia tutaj

5. Użyj rozszerzenia Swift w kodzie Objective-c

Szybkie rozszerzenie

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

Kod celu C (kod wywołujący)

[UIView swiftExtensionFunc];

6. Użyj rozszerzenia Objective-c w szybkim kodzie

Rozszerzenie Objective-C (UIViewExtension.h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIViewExtension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

Szybki kod (kod wywołujący)

UIView.objcExtensionFunc()
Wasilij Bodnarchuk
źródło
Te próbki są naprawdę pomocne, dziękuję! A jeśli chodzi o Swift 4+, musimy dodać @objcMembersprzed klasą. Ponieważ @objcwnioskowanie zostało zmniejszone w Swift 4 w celu optymalizacji. Na przykład właściwość w klasie pochodnej NSObject nie będzie już domyślnie wnioskować o @objc (tak jak w Swift 3). Mam informacje z tej odpowiedzi .
Hustlion
11

Miałem ten sam problem i okazało się, że specjalne symbole w nazwie modułu zostały zastąpione przez xcode (w moim przypadku kreski zakończyły się podkreśleniem). W ustawieniach projektu zaznacz „nazwa modułu”, aby znaleźć nazwę modułu dla swojego projektu. Następnie użyj ModuleName-Swift.hlub zmień nazwę modułu w ustawieniach.

Max Micheyenko
źródło
10
Jestem kretynem. Dodałem nazwę klasy, a następnie dopisałem „-Swift”. Okazuje się, że to nazwa „modułu”. +1 za uświadomienie mi tego.
HotFudgeSunday
2
Kolejny kretyn, który myślał, że to nazwa klasy!
Charlie Martin,
9

Plik jest tworzony automatycznie (tutaj mowa o Xcode 6.3.2). Ale go nie zobaczysz, ponieważ znajduje się w folderze danych pochodnych. Po oznaczeniu swojej szybkiej klasy za pomocą @objc, skompiluj, a następnie wyszukaj Swift.hw folderze Dane pochodne. Powinieneś tam znaleźć nagłówek Swift.

Miałem problem, że Xcode przemianował mój my-Project-Swift.hna my_Project-Swift.hXcode, nie lubi "." "-"symboli itp. Za pomocą powyższej metody możesz znaleźć nazwę pliku i zaimportować go do klasy Objective-C.

mózg
źródło
1
To też rozwiązało mój problem. W moim pliku .m importuję taki plik, #import "my_project-Swift.h" a faktyczna nazwa mojego projektu tomy-project
Bhavin_m
Uwaga - nie tylko „.” „-” także spacje :(
user1105951,
8

Wystarczy dołączyć #import „myProject-Swift.h” do pliku .m lub .h

PS Nie znajdziesz „myProject-Swift.h” w inspektorze plików, jest on ukryty. Ale jest generowany automatycznie przez aplikację.

Svitlana
źródło
Dzięki za heads-up, kolego.
Felipe
Ta odpowiedź pomogła mi i uratowała mi dzień. Ważne jest to, że Xcode generuje go automatycznie i jest to plik HIDDEN. Sam tworzyłem „myProject-Swift.h” i to nie działało.
C0mrade,
5

Odpowiedź @ sig jest jedną z najlepszych, jednak nie działała dla mnie ze starym projektem (nie nowym!), potrzebowałem modyfikacji. Po wielu odmianach znalazłem dla mnie przepis (używając XCode 7.2):

  1. Nazwa modułu produktu: $ (PRODUCT_NAME: c99extidentifier)
  2. Definiuje moduł: NIE
  3. Zawartość osadzona zawiera Swift: NO
  4. Zainstaluj nagłówek zgodności Objective-C: TAK
  5. Cel-C Bridging Header: ProjectName-Bridging-Header.h

Ostatni punkt (5) był kluczowy. Umieściłem go tylko w drugiej sekcji (pole Cele), pole projektu powinno pozostać puste: w wprowadź opis zdjęcia tutajprzeciwnym razie nie wygenerowałoby dla mnie odpowiedniego pliku „Project-Swift.h” (nie zawierało szybkich metod).

Darius Miliauskas
źródło
1
również pomocny link: ericasadun.com/2014/08/21/…
Darius Miliauskas
1
Dzięki Dziękuję Bardzo dziękuję @DariusMiliauskas działa tylko z Twoim linkiem
a4arpan 24.04.2016
1
@DariusMiliauska bardzo dziękuje! 5-punktowy problem rozwiązał również dla mnie w starym projekcie Xcode
tatiana_c,
Define Modulespowinno być No??
Sunil Chauhan
@SunilChauhan, Tak, jest używany tylko do ramek .
Iulian Onofrei
5

Są dwa warunki

  • Użyj pliku szybkiego w pliku celu c.
  • Użyj pliku celu c w pliku szybkim.

W tym celu musisz wykonać następujące kroki:

  • Dodaj swój szybki plik w projekcie celu C lub odwrotnie.
  • Utwórz plik nagłówka (.h).
  • Przejdź do Ustawień kompilacji i wykonaj poniższe kroki z wyszukiwaniem,

    1. wyszukaj ten tekst „brid” i ustaw ścieżkę do pliku nagłówka.
    2. „Definiuje moduł”: TAK.
    3. „Zawsze osadzaj szybkie biblioteki standardowe”: TAK.
    4. „Zainstaluj nagłówek zgodności Objective-C”: TAK.

Następnie wyczyść i odbuduj swój projekt.

Użyj pliku szybkiego w pliku celu c.

W takim przypadku najpierw napisz „@objc” przed klasą w szybkim pliku.

Następnie w pliku celu c napisz to,

  #import "YourProjectName-Swift.h"

Użyj pliku celu c w pliku szybkim.

W takim przypadku w pliku nagłówkowym napisz to,

  #import "YourObjective-c_FileName.h"

Mam nadzieję, że to Ci pomoże.

Vikas Prajapati
źródło
4

W przypadku Swift 5:

  1. Dodaj @objcsłowo kluczowe do swojej klasy i metod
  2. Dodaj publicsłowo kluczowe do swojej klasy i metod
  3. Pozwól swojej klasie odziedziczyć NSObject
  4. Zbuduj projekt
  5. Umieść #import "MyProject-Swift.h"plik Objective-C

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }
Nico S.
źródło
„Dodaj słowo kluczowe @objc do swojej klasy i metod” - to samo dla Swift 4
Krzysztof Skrzynecki
3

W moim przypadku oprócz tych kroków:

  1. Nazwa modułu produktu: myproject
  2. Definiuje moduł: TAK
  3. Zawartość osadzona zawiera Swift: TAK
  4. Zainstaluj nagłówek zgodności Objective-C: TAK
  5. Celujący mostek nagłówka: $ (SRCROOT) /Sources/SwiftBridging.h

Musiałem ustawić klasę jako publiczną , aby utworzyć plik productName-Swift.h :

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }
93sauu
źródło
2

Właśnie odkryłem, że dodanie katalogu szybkich plików do projektu nie zadziała. Najpierw musisz utworzyć grupę dla katalogu, a następnie dodać szybkie pliki ...

Darren Ehlers
źródło
@ <konkretna klasa>; należy zdefiniować, a następnie projekt używający zobaczy te pliki.
Nikita
2

Miałem ten sam problem i ostatecznie okazało się, że nie byli przywiązani do tych samych celów. Klasa ObjC jest dołączona do Target1 i Target2, klasa Swift jest dołączona tylko do Target1 i nie jest widoczna w klasie ObjC.

Mam nadzieję, że to komuś pomoże.

Dani.Rangelov
źródło
Całkowicie przeoczyłem to przy różnych celach związanych z inscenizacją i produkcją. Dziękuję za Twoją odpowiedź!
Benjamin Martin
Co oznacza „przywiązany”?
Iulian Onofrei
„załącznik” = „członkowie”, należy wymienić ich jako członków docelowych
Dani.Rangelov
1

mój problem polegał na tym, że utknąłem po utworzeniu pliku pomostu przez xcode, ale nadal mam błąd w nazwie pliku nagłówka MYPROJECTNAME-swift.h

1. Sprawdzam w terminalu i szukam wszystkich automatycznie utworzonych plików szybkiego mostu:

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

widzisz, co stworzył xcode.

  1. w moim przypadku miałem miejsce w nazwie mojego projektu i xcode zamień to na „_”
użytkownik1105951
źródło
1

Gdy dodajesz nowe pliki Swift do projektu, pamiętaj, aby dodać je do poprawnych celów. Upewnij się, że każdy szybki plik, którego będziesz używać, dziedziczy klasę NSObject i jest opatrzony adnotacją @ObjCMembers Zmień na TAK w ustawieniach kompilacji w opcji ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Zmień na TAK w ustawieniach kompilacji w opcji DEFINES_MODULE.

Boris
źródło
0

Mam ten sam błąd: myProjectModule-Swift.hnie znaleziono pliku „, ale w moim przypadku przyczyną był niewłaściwy cel instalacji:” Swiftjest niedostępny w systemie OS X wcześniejszym niż 10.9; ustaw MACOSX_DEPLOYMENT_TARGETna 10.9 lub nowszy (obecnie jest to „10.7”) ”, więc kiedy zmieniłem cel wdrożenia na 10.9 - projekt został pomyślnie skompilowany.

slavik
źródło
0

Mój problem polegał na tym, że automatyczne generowanie pliku -swift.h nie było w stanie zrozumieć podklasy CustomDebugStringConvertible. Zamiast tego zmieniłem klasę na podklasę NSObject. Następnie plik -swift.h poprawnie zawierał klasę.

Justin Domnitz
źródło
0

Miałem problemy polegające na tym, że dodawałem klasy do mojego nagłówka pomostowego celu-c, aw importowanych nagłówkach celu-c próbowano zaimportować szybki nagłówek. Nie podobało mi się to.

Tak więc we wszystkich moich klasach-c, które używają szybkich, ale również zmostkowanych, kluczem było upewnienie się, że używasz deklaracji klas do przodu w nagłówkach, a następnie importujesz plik „* -Swift.h” do pliku .m.

podkowa 7
źródło
0

Nie musiałem zmieniać żadnych ustawień w kompilacji ani dodawać @obj do klasy.

Wszystko, co musiałem zrobić, to utworzyć nagłówek mostu, który byłby automatycznie tworzony, kiedy tworzyłem klasy Swift w projekcie Objective-c. A potem musiałem to zrobić

import „Bedtime-Swift.h” <- wewnątrz pliku celu-c, który musiał użyć tego szybkiego pliku.

coolcool1994
źródło
0

cóż, po przeczytaniu wszystkich komentarzy i ponownym przeczytaniu i ponownym spróbowaniu udało mi się włączyć szybkie klasy do mojego projektu Big obj-c. Dzięki za wszelką pomoc. Chciałem podzielić się jedną wskazówką, która pomogła mi lepiej zrozumieć ten proces. W klasie .m udałem się do linii importu szybkiej nazwy docelowej #import „myTargetName-Swift.h” i kliknąłem klawisz:

polecenie + kliknięcie myszą -> Przejdź do definicji wprowadź opis zdjęcia tutaj

Tam możesz zobaczyć całe tłumaczenie z swift na obj-c, a znajdziesz różne funkcje zadeklarowane w obj-c. Mam nadzieję, że ta wskazówka pomoże ci tak bardzo, jak pomogła mi.

Techno Mag
źródło
0

Używanie szybkich klas w celu C

Jeśli zamierzasz zaimportować kod w ramach celu aplikacji (mieszanie Objective-C i Swift w jednym projekcie), powinieneś użyć następnego wiersza importu, #import "<#YourProjectName#>-Swift.h"aby udostępnić kod Swift do kodu Objective-C [Mieszanie Swift i Objective-C w projekcie]

W tym poście opiszę, jak zaimportować statyczną bibliotekę Swift do kodu Objective-C

Cel C konsument -> Szybka biblioteka statyczna

Wersja Xcode 10.2.1

Utwórz szybką bibliotekę statyczną

Śledź Create Swift static librarykolejne dodatki:

Ujawnij Swift API. Aby korzystać z funkcji Swift z Objective-C [Informacje]

Po zbudowaniu powinieneś znaleźć <product_name>-Swift.hplik, który powinien znajdować się w DerivedSources [Nie znaleziono pliku]

Konsument C celu z biblioteką statyczną Swift

Drag and dropplik binarny do projektu Xcode [Informacje]

Link Library[Niezdefiniowane symbole] [Link vs Osadź]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

Dodaj Library Search paths[Nie znaleziono biblioteki dla] [Ścieżka rekurencyjna]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

Dodaj Header Search Paths[Nie znaleziono modułu] [Ścieżka rekurencyjna]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

Dodaj puste .swift filedo projektu Objective-C. [Niezdefiniowane symbole] Gdy zapytasz Xcode, naciśnij Utwórz Bridging Header(utworzy module_name-Bridging-Header.h) i ustaw ścieżkę do tego pliku

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

Zaimportuj moduł do kodu klienta Objective-C [Nie znaleziono pliku] [nazwa_modułu]

#import "module_name-Swift.h"

Więcej przykładów tutaj

yoAlex5
źródło
0

XCode 11.3.1:

Kiedy chcę użyć wewnętrznej klasy Swift w kodzie objc, nie kompiluje się pod kątem błędu „niezdefiniowany symbol” (dla innej klasy wewnętrznej i zewnętrznej), sprawdziłem wygenerowany nagłówek „-swift.h” i obie klasy są tam.

Po wielu godzinach próbuję przekształcić klasę wewnętrzną w normalną i kompiluje się.

Oczyszczam projekt, usuwam folder DerivedData i się kompiluje.

Bill Chan
źródło
1
Czy próbowałeś dodać @objcprzed deklaracją klasy wewnętrznej?
dnnagy
dzięki @dnnagy, sprawdziłem, czy to nie problem ze składnią.
Bill Chan
-1

Po wykonaniu wszystkich powyższych czynności nadal mam błędy. Mój problem polegał na tym, że pliki Swift, których potrzebowałem, nie zostały z jakiegoś powodu dodane do zasobów pakietu.

Naprawiłem to, przechodząc do [MyTarget]> Fazy kompilacji> Kopiuj zasoby pakietu, a następnie kliknąłem przycisk plus i dodałem pliki Swift.

onemoreanimal
źródło
Kopiuj zasoby pakietu nie powinny zawierać kodu źródłowego
Bill Chan