it-swarm.dev

Czy można wywołać kod celu-c Swift w klasie?

Przeszukałem niektóre posty, myślę, że nie mogę napisać rozszerzenia w Swift i wywołać go z kodu Objective-C, prawda?

@objc jak atrybuty obsługują tylko metody, klasy, protokoły?

81
sprhawk

Możesz napisać rozszerzenie Swift i użyć go w kodzie ObjectiveC. Testowane z XCode 6.1.1.

Wszystko, co musisz zrobić, to:

  • utwórz rozszerzenie w Swift (bez adnotacji @objc)

  • zaimportuj „ProjectTarget-Swift.h” do swojej klasy ObjectiveC (gdzie „ProjectTarget” reprezentuje cel XCode, z którym Swift))

  • wywołaj metody z rozszerzenia Swift

63
marius bardan

Dowiedziałem się, że w Swift 4. musiałem dodać @objc przed moim rozszerzenie słowem kluczowym, aby metody rozszerzenia Swift były widoczne przez instancję klasy Objc, którą rozszerzałem.

W skrócie:

Konfiguracja konfiguracji pliku:

CustomClass.h
CustomClass.m
CustomClassExtension.Swift

W CustomClassExtension:

@objc extension CustomClass
{
    func method1() 
    {
        ...
    }
}

W mojej aplikacjiDelegate.m:

self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
60
Andy P.

To rozwiązanie działa dla Swift 2.2 i Swift. Zauważ, że z Objective-C dostępne będą tylko rozszerzenia dla klas (nie dla struktur i wyliczeń).

import UIKit

extension UIColor {

    //Custom colours
    class func otheEventColor() -> UIColor {
        return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
    }
}

Następnie # import „ProductModuleName-Swift.h” w pliku ObjC.

41
Foti Dim

Jak opisano w innych odpowiedziach, importowanie wygenerowanego Swift nagłówek działa w większości przypadków.

Wyjątkiem jest sytuacja, gdy kategoria jest zdefiniowana na typie zmostkowanym (tzn. Rozszerzenie jest zdefiniowane na String, a nie NSString). Te kategorie nie będą automatycznie łączone z odpowiednikami Objective-C. Aby obejść ten problem, musisz albo użyć typu Objective-C (i rzucić wartość zwracaną w swoim Swift kod za pomocą as String) lub zdefiniuj rozszerzenie dla obu typów Swift i Objective-C).

40
mclaughlinj

Import "# import" ProductModuleName-Swift.h " nagłówek w pliku celu-c i dodaj @ objc przed twoim rozszerzenie w Swift. Będzie działał dobrze w Swift 4.2 i Swift 5

0
Ranjani