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?
objective-c
swift
swift-extensions
Sprhawk
fonte
fonte
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:fonte
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:
Em CustomClassExtension:
Em meu AppDelegate.m:
fonte
@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.
Em seguida, #import "ProductModuleName-Swift.h" em seu arquivo ObjC.
Swift 4
fonte
public
é necessário? Funciona bem sempublic
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ãoNSString
). 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 comas String
) ou definir uma extensão para os tipos Swift e Objective-C.fonte
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 StringImporte o cabeçalho "#import" ProductModuleName-Swift.h " no arquivo object -c e adicione @objc na frente de sua extensão no arquivo swift. Ele funcionará bem no swift 4.2 e no swift 5
fonte