Ho cercato alcuni post, penso di non poter scrivere un'estensione sotto swift e chiamarla dal codice Objective-C, giusto?
@objc come gli attributi supportano solo metodi, classi, protocolli?
Ho cercato alcuni post, penso di non poter scrivere un'estensione sotto swift e chiamarla dal codice Objective-C, giusto?
@objc come gli attributi supportano solo metodi, classi, protocolli?
Risposte:
Puoi scrivere un'estensione Swift e usarla nel codice Objective-C. Testato con XCode 6.1.1.
Tutto quello che devi fare è:
crea la tua estensione in Swift (nessuna @objc
annotazione)
#import "ProjectTarget-Swift.h"
nella tua classe Objective-C (dove "ProjectTarget" rappresenta il target XCode a cui è associata l'estensione Swift)
chiama i metodi dall'estensione Swift
Aggiornamento:
come indicato da @Rizwan Ahmed, è necessario aggiungere @objc
un'annotazione:
A partire da Swift 4.0.3, l'annotazione @objc è necessaria se si desidera utilizzare l'estensione nei file di classe Objective C.
Ho scoperto che in Swift 4.0 dovevo aggiungere @objc
davanti alla mia parola chiave di estensione in modo che i metodi di estensione Swift diventassero visibili da un'istanza della classe Objc che stavo estendendo.
In breve:
Configurazione della configurazione dei file:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
In CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
Nella mia AppDelegate.m:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
annotazione.
Questa soluzione funziona per Swift 2.2 e Swift 3 . Nota che solo le estensioni per le classi (non per strutture o enumerazioni) saranno accessibili da 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)
}
}
Quindi #import "ProductModuleName-Swift.h" nel file ObjC.
Swift 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
è necessario? Funziona bene senza public
modificatore per me. Presumiamo che l'estensione non sia nello stesso progetto ma venga importata da un altro progetto?
Come spiegato nelle altre risposte, l'importazione dell'intestazione Swift generata funziona nella maggior parte dei casi .
Un'eccezione è quando la categoria è definita su un tipo con ponte (cioè l'estensione è definita su String
e non NSString
). Queste categorie non verranno automaticamente collegate alle loro controparti Objective-C. Per aggirare questo problema, dovrai utilizzare il tipo Objective-C (ed eseguire il cast del valore restituito nel codice Swift con as String
) o definire un'estensione per entrambi i tipi Swift e Objective-C.
public extension NSString
. Se si ottiene un identificatore non risolto o un errore simile in fase di compilazione, è possibile eseguire nuovamente il cast su String eg let sVal = self as String
e quindi chiamare il codice necessario susVal
mclaughlinj
detto, sia per la classe NSString che per la struttura String