Przeszukałem kilka postów, myślę, że nie mogę napisać rozszerzenia w ramach szybkiego i wywołać go z kodu Objective-C, prawda?
@objc podobnie jak atrybuty obsługują tylko metody, klasy, protokoły?
Przeszukałem kilka postów, myślę, że nie mogę napisać rozszerzenia w ramach szybkiego i wywołać go z kodu Objective-C, prawda?
@objc podobnie jak atrybuty obsługują tylko metody, klasy, protokoły?
Odpowiedzi:
Możesz napisać rozszerzenie Swift i używać go w kodzie Objective-C. Przetestowano za pomocą XCode 6.1.1.
Wszystko, co musisz zrobić, to:
utwórz rozszerzenie w Swift (bez @objc
adnotacji)
#import "ProjectTarget-Swift.h"
w klasie Objective-C (gdzie „ProjectTarget” reprezentuje cel XCode, z którym jest skojarzone rozszerzenie Swift)
wywołać metody z rozszerzenia Swift
Aktualizacja:
Jak wspomniano @Rizwan Ahmed, musisz dodać @objc
adnotację:
Od wersji Swift 4.0.3 adnotacja @objc jest potrzebna, jeśli chcesz używać rozszerzenia w plikach klasy Objective C.
I okazało się, że w Swift 4.0 musiałem dodać @objc
przed moim rozszerzeniem słów kluczowych w celu metod przedłużających Swift, by stać się widoczny przez instancji objc klasie byłem rozciągającej.
W skrócie:
Konfiguracja konfiguracji plików:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
W CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
W moim AppDelegate.m:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
adnotację.
To rozwiązanie działa dla Swift 2.2 i Swift 3 . Zauważ, że tylko rozszerzenia dla klas (nie dla struktur lub wyliczeń) będą dostępne z Objective-C.
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Następnie #import „ProductModuleName-Swift.h” w pliku ObjC.
Szybki 4
extension UIColor {
// As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
@objc
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
public
jest potrzebny? U mnie działa dobrze bez public
modyfikatora. Czy zakładamy, że rozszerzenie nie znajduje się w tym samym projekcie, ale jest importowane z innego projektu?
Jak opisano w innych odpowiedziach, importowanie wygenerowanego nagłówka Swift działa w większości przypadków .
Wyjątkiem jest sytuacja, gdy kategoria jest zdefiniowana dla typu pomostowego (tj. Rozszerzenie jest zdefiniowane na, String
a nie NSString
). Kategorie te nie zostaną automatycznie połączone z ich odpowiednikami w celu C. Aby to obejść, musisz albo użyć typu Objective-C (i rzutować wartość zwracaną w kodzie Swift za pomocą as String
), albo zdefiniować rozszerzenie dla obu typów Swift i Objective-C.
public extension NSString
. Jeśli pojawi się nierozwiązany identyfikator lub podobny błąd w czasie kompilacji, możesz ponownie rzutować z powrotem na String, np., let sVal = self as String
A następnie wywołać niezbędny kod nasVal
mclaughlinj
powiedziałem, zarówno dla klasy NSString, jak i struktury String