Pesquisei alguns posts, acho que não consigo escrever uma extensão no swift, e chamá-la do código Objective-C, certo?
Os atributos do tipo @objc suportam apenas métodos, classes, protocolos?
Pesquisei alguns posts, acho que não consigo escrever uma extensão no swift, e chamá-la do código Objective-C, certo?
Os atributos do tipo @objc suportam apenas métodos, classes, protocolos?
Respostas:
Você pode escrever uma extensão Swift e usá-la no código Objective-C. Testado com XCode 6.1.1.
Tudo que você precisa fazer é:
crie sua extensão em Swift (sem @objc
anotação)
#import "ProjectTarget-Swift.h"
em sua classe Objective-C (onde "ProjectTarget" representa o alvo XCode ao qual a extensão Swift está associada)
chame os métodos da extensão Swift
Atualização:
como @Rizwan Ahmed mencionado, você precisa adicionar uma @objc
anotação:
A partir do Swift 4.0.3, a anotação @objc é necessária se você quiser usar a extensão em arquivos de classe C Objective.
Eu descobri que no Swift 4.0 eu tinha que adicionar a palavra-chave à @objc
frente da minha extensão para que os métodos de extensão do Swift se tornassem visíveis por uma instância da classe Objc que eu estava estendendo.
Em resumo:
Configuração de arquivo:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
Em CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
Em meu AppDelegate.m:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
anotação.
Esta solução funciona para Swift 2.2 e Swift 3 . Observe que apenas extensões para classes (não para structs ou enums) estarão acessíveis a partir do 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)
}
}
Em seguida, #import "ProductModuleName-Swift.h" em seu arquivo 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
é necessário? Funciona bem sem public
modificador para mim. Estamos presumindo que a extensão não está no mesmo projeto, mas sendo importada de outro projeto?
Conforme abordado nas outras respostas, a importação do cabeçalho Swift gerado funciona na maioria dos casos .
Uma exceção a isso é quando a categoria é definida em um tipo com ponte (ou seja, a extensão é definida como ativada String
e não NSString
). Essas categorias não serão automaticamente vinculadas a suas contrapartes Objective-C. Para contornar isso, você precisará usar o tipo Objective-C (e lançar o valor de retorno em seu código Swift com as String
) ou definir uma extensão para os tipos Swift e Objective-C.
public extension NSString
. Se você obtiver um identificador não resolvido ou erro semelhante em tempo de compilação, você pode converter novamente para String, por exemplo, let sVal = self as String
e chamar o código necessário emsVal
mclaughlinj
dito, para a classe NSString e a estrutura String