objective-c - online - uikit objective c




Como chamar o código Objective-C do Swift (10)

Na nova linguagem Swift da Apple, como se chama o código Objective-C?

A Apple mencionou que eles poderiam coexistir em um aplicativo, mas isso significa que tecnicamente é possível reutilizar classes antigas feitas no Objective-C enquanto se constroem novas classes no Swift?

O raciocínio

O Objective-C é uma linguagem independente de plataforma, enquanto o Swift depende da plataforma. Escrever código não dependente de plataforma (bibliotecas de lógica de negócios) no Swift, portanto, não seria sensato. No entanto, escrever código dependente de plataforma (interface relacionada, por exemplo) estaria perfeitamente bem. Não quer dizer que seria uma boa ideia, no entanto, é definitivamente um interesse.


Usando Classes Objective-C no Swift

** Se você tiver uma turma existente que gostaria de usar, execute a Etapa 2 e pule para a Etapa 5 . (Para alguns casos, eu tive que adicionar um #import <Foundation/Foundation.h explícito #import <Foundation/Foundation.h para um arquivo Objective-C mais antigo.) **

Etapa 1: Adicionar Implementação do Objective-C - .m

Adicione um arquivo .m à sua classe e nomeie-o como CustomObject.m .

Etapa 2: adicionar cabeçalho de ponte

Ao adicionar seu arquivo .m , você provavelmente será atingido por um prompt semelhante a este:

Clique em SIM !

Se você não viu o prompt, ou acidentalmente excluiu o cabeçalho da ponte, adicione um novo arquivo .h ao seu projeto e nomeie-o como <#YourProjectName#>-Bridging-Header.h .

Em algumas situações, particularmente quando se trabalha com frameworks Objective-C, você não adiciona uma classe Objective-C explicitamente e o Xcode não consegue encontrar o linker. Nesse caso, crie seu arquivo .h chamado como mencionado acima e, em seguida, certifique-se de vincular seu caminho nas configurações do projeto de destino, da seguinte forma:

Nota

É uma boa prática vincular seu projeto usando a macro $(SRCROOT) para que, se você mover seu projeto ou trabalhar nele com outras pessoas usando um repositório remoto, ele ainda funcione. $(SRCROOT) pode ser considerado como o diretório que contém seu arquivo .xcodeproj. Pode parecer assim:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

Etapa 3: Adicionar cabeçalho Objective-C - .h

Adicione outro arquivo .h e nomeie-o como CustomObject.h .

Passo 4: Construa sua classe Objective-C

Em CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

Em CustomObject.m

#import "CustomObject.h"

@implementation CustomObject 

- (void) someMethod {
    NSLog(@"SomeMethod Ran");
}

@end

Etapa 5: adicionar classe ao cabeçalho de ponte

Em YourProject-Bridging-Header.h :

#import "CustomObject.h"

Etapa 6: use seu objeto

Em SomeSwiftFile.swift :

var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

Não há necessidade de importar explicitamente; é para isso que serve o cabeçalho de bridging.

Usando classes Swift no Objective-C

Etapa 1: criar nova classe Swift

Adicione um arquivo .swift ao seu projeto e nomeie-o como MySwiftObject.swift .

Em MySwiftObject.swift :

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val"

    init() {}

    func someFunction(someArg:AnyObject) -> String {
        var returnVal = "You sent me \(someArg)"
        return returnVal
    }   
}

Etapa 2: Importar arquivos Swift para a classe ObjC

Em SomeRandomClass.m :

#import "<#YourProjectName#>-Swift.h"

O arquivo: <#YourProjectName#>-Swift.h já deve ser criado automaticamente em seu projeto, mesmo que você não possa vê-lo.

Etapa 3: use sua turma

MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);

Nota:

1. CodeCompletion não estava se comportando com a mesma precisão que eu gostaria. No meu sistema, executar uma compilação rápida com "cmd + r" pareceu ajudar o Swift a encontrar parte do código Objective-C e vice-versa.

2. Se você adicionar um arquivo .swift a um projeto mais antigo e obter um erro: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib , tente reiniciar completamente o Xcode .

3. Embora fosse originalmente possível usar classes Swift puras em Objective-C usando o prefixo @objc , depois do Swift 2.0, isso não é mais possível. Veja o histórico de edição para obter uma explicação original. Se essa funcionalidade for reativada em futuras versões do Swift, a resposta será atualizada de acordo.


Mais uma coisa que gostaria de acrescentar aqui:

Estou muito agradecido pela resposta do @ Logan. Isso ajuda muito a criar um arquivo de ponte e configurações.

Mas depois de fazer todos esses passos eu ainda não estou recebendo uma classe Objective-C no Swift.

Eu usei a biblioteca de cocoapods e a cocoapods no meu projeto. Qual é o pod "pop" .

Portanto, se você estiver usando os pods Objective-C no Swift, pode haver uma chance de não conseguir obter ou import as classes para o Swift.

A coisa mais simples que você precisa fazer é:

  1. Vá para o arquivo <YOUR-PROJECT>-Bridging-Header e
  2. Substitua a instrução #import <ObjC_Framework> para @import ObjC_Framework

Por exemplo: (biblioteca pop)

Substituir

#import <pop/POP.h>

com

@import pop;

Use a clang import quando o #import não estiver funcionando.


Apenas uma nota para quem está tentando adicionar uma biblioteca Objective-C ao Swift: Você deve adicionar -ObjC em Build Settings -> Linking -> Other Linker Flags .


Aqui estão instruções passo a passo para usar o código Objective-C (neste caso, uma estrutura fornecida por terceiros) em um projeto Swift:

  1. Adicione qualquer arquivo Objective-C ao seu projeto Swift escolhendo File -> New -> New File -> Objective-C File. Ao salvar, o Xcode perguntará se você deseja adicionar um cabeçalho de bridging . Escolha ' Sim '. Gif: adicionando arquivo vazio para projetar e gerando o cabeçalho de bridging http://www.derrrick.com//1-empty-file.gif

Em passos simples:

  1. Um prompt aparece e, em seguida, clique em OK ... Se ele não aparecer, vamos criá-lo manualmente como a seguir ... Crie um arquivo de cabeçalho da fonte iOS e forneça o nome ProjectName-Bridging-Header (exemplo: Teste -Bridging-Header) e, em seguida, vá para construir configuração no código do compilador Swift -> ponte Objective-C adicionar o nome da ponte Objective-C .. (Test / Test-Bridging-Header.h). Sim, está completo

  2. Opcionalmente, exclua o arquivo Objective-C que você adicionou (chamado "qualquer coisa" na imagem GIF acima). Você não precisa mais.

  3. Abra o arquivo de cabeçalho de bridging - o nome do arquivo está no formato [YourProject] -Bridging-Header.h . Inclui um comentário fornecido pelo Xcode. Adicione uma linha de código para o arquivo Objective-C que você deseja incluir , como uma estrutura de terceiros. Por exemplo, para adicionar o Mixpanel ao seu projeto, você precisará adicionar a seguinte linha de código ao arquivo de cabeçalho de ponte:

    #import "Mixpanel.h"
  4. Agora, em qualquer arquivo do Swift, você pode usar o código Objective-C existente, na sintaxe do Swift (no caso deste exemplo, e você pode chamar os métodos do SDK do Mixpanel, etc.). Você precisa se familiarizar com a forma como o Xcode traduz o Objective-C para o Swift. O guia da Apple é uma leitura rápida. Ou veja esta resposta para um resumo incompleto.

Exemplo para o Mixpanel:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

É isso aí!

Nota: Se você remover o arquivo de cabeçalho de ponte de seu projeto , certifique-se de entrar em Configurações de Compilação e remover o valor de " Cabeçalho de Ponte de Objetivo-C " em "Compilador Swift - Geração de Código".


Clique no menu Novo arquivo e escolha o idioma do arquivo selecionado. Objetivo. Nesse momento, ele gera automaticamente um arquivo "Objective-C Bridging Header" que é usado para definir algum nome de classe.

"Objective-C Bridging Header" em "Swift Compiler - Code Generation".


Consulte o guia da Apple sobre como usar o Swift com o Cocoa e o Objective-C . Este guia aborda como usar os códigos Objective-C e C do Swift e vice-versa e tem recomendações sobre como converter um projeto ou misturar e combinar as partes do Objective-C / C e do Swift em um projeto existente.

O compilador gera automaticamente a sintaxe do Swift para chamar funções C e métodos Objective-C. Como visto na documentação, este Objective-C:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

se transforma neste código Swift:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

O Xcode também faz esta tradução em tempo real - você pode usar o Open Rapidamente enquanto edita um arquivo Swift e digitar um nome de classe Objective-C, e ele o levará para uma versão Swift do cabeçalho da classe. (Você também pode obter isso clicando cmd em um símbolo da API em um arquivo Swift.) E toda a documentação de referência da API nas bibliotecas do desenvolvedor do iOS 8 e OS X v10.10 (Yosemite) é visível no Objective-C e no Swift formulários (por exemplo, UIView ).


Eu escrevi um projeto simples do Xcode 6 que mostra como misturar código C ++, Objective-C e Swift:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

Em particular, o exemplo chama uma função Objective-C e C ++ do Swift .

A chave é criar um cabeçalho compartilhado, Project-Bridging-Header.he colocar os cabeçalhos do Objective-C nele.

Por favor, baixe o projeto como um exemplo completo.


Você pode ler o post agradável Swift & Cocoapods . Basicamente, precisamos criar um arquivo de cabeçalho de ponte e colocar todos os cabeçalhos do Objective-C lá. E então precisamos referenciá-lo de nossas configurações de construção. Depois disso, podemos usar o código Objective-C.

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

Também dê uma olhada no documento da Apple Usando Swift com Cocoa e Objective-C também.


Abordagem bidirecional para usar objetivo-c objetivo-c

1

1. Create bridge-header.h file in Xcode Project
2. import .h file in bridge-Header file
3. Set path of bridge-Header in Build settings. 
3. Clean the Project 

2

  1. Create objective-c files in project(it automatically set path in Build Settings for you )
  2. import .h file in bridge-Header file

Agora é bom ir Obrigado


No projeto do Swift 4.2.1 no Xcode 10.1, você pode adicionar facilmente o arquivo Objective-C. Siga os passos abaixo para ligar o arquivo Objective-C ao projeto Swift.

Step_01: Crie um novo projeto Xcode usando a linguagem Swift:

File > New > Project > objc .

Step_02: No projeto Swift, inclua o novo arquivo Objective-C:

File > New > File... > macOS > Objective-C File .

Passo 03: Se você adicionar um novo arquivo Objective-C no projeto Swift pela primeira vez, o Xcode perguntará a você:

Would you like to configure an Objective-C bridging header ?

Passo 04: selecione a opção:

Create Bridging Header .

Step_05: Um arquivo correspondente será gerado com um nome:

Objc-Bridging-Header.h .

Passo 06: Agora, você precisa configurar o caminho do arquivo Bridge no cabeçalho da bridge. No Project Navigator, clique no projeto com o nome objc e escolha:

Build Settings > Objective-C Bridging Header > Objc-Bridging-Header.h .

Step_07: Arraste e solte seu Objc-Bridging-Header.h na caixa para gerar um caminho de arquivo.

Passo 08: Abra seu Objc-Bridging-Header.h e importe o arquivo Objective-C que você deseja usar em seu arquivo Swift.

#import "SpecialObjcFile.m"

Aqui está um conteúdo de SpecialObjcFile.m :

#import <Foundation/Foundation.h>

@interface Person: NSObject {
@public
    bool busy;
}
@property
    bool busy;
@end

Passo 09: Agora no seu arquivo Swift, você pode usar uma classe Objective-C:

override func viewDidLoad() {
    super.viewDidLoad()
    let myObjcContent = Person()
    print(myObjcContent.busy)
}





swift