Como criar uma classe rápida para a categoria?

84

Quero criar a categoria da minha classe Swift existente, mas não há opção no IDE para fazer isso.

Alguma ideia se a categoria existe no projeto rápido? Ou como obter funcionalidade semelhante no projeto rápido?

Khawar
fonte
2
chamou extension.
holex

Respostas:

128

No Swift, você pode usar Extensionspara adicionar novas funcionalidades às classes, estruturas e tipos de enumeração existentes.

Eles diferem das categorias Objective-C em alguns aspectos, principalmente:

  • Eles não são nomeados
  • Você não precisa importar uma extensão explicitamente. Se você definir uma extensão para adicionar nova funcionalidade a um tipo existente, a nova funcionalidade estará disponível em todas as instâncias existentes desse tipo, mesmo se elas foram criadas antes da extensão ser definida.
  • Como dito acima, eles funcionam não apenas com classes, mas também com outros tipos.

Como está hoje, as extensões podem:

  • Adicionar propriedades computadas e propriedades estáticas computadas
  • Definir métodos de instância e métodos de tipo
  • Fornece novos inicializadores
  • Definir subscritos
  • Defina e use novos tipos aninhados
  • Faça um tipo existente em conformidade com um protocolo

A sintaxe básica para declarar uma extensão é a seguinte:

extension SomeType {
    // new functionality to add to SomeType goes here
}

Verifique a documentação da Apple para obter mais informações sobre como usar extensões em Swift.

Cezar
fonte
99

Em Objective C, eram chamadas de categorias , mas em Swift são chamadas de extensões . O objetivo de ambos é fornecer funcionalidade adicional às classes existentes sem ter que criar subclasses.

Eu tinha lido sobre extensões na documentação, mas eu realmente não entendia como usar uma em meu projeto até assistir a este vídeo tutorial ( versão do YouTube , fonte do github ).

Aqui está um resumo retirado do vídeo de como fazer isso.

Adicione um arquivo Swift ao seu projeto

  • Clique com o botão direito no Navegador do Projeto e escolha "Novo Arquivo ..."

  • Selecione "Arquivo Swift"

  • A convenção é salvar o nome do arquivo como o nome da classe que você está estendendo mais (com um sinal "+") o que está fazendo com ele. Por exemplo, "UIImage + Cropping".

Escreva o código para a extensão

Abra o novo arquivo Swift que você acabou de criar.

Você deve importar UIKit(em vez de Foundation) se estiver estendendo a UIView. Então use oextension palavra chave antes do nome da classe que deseja estender. Você pode então adicionar seus próprios novos métodos à classe. (Observe que as extensões são para adicionar novos métodos, não substituir os métodos existentes - daí o nome.)

No vídeo, o exemplo foi adicionar um método que recorta um círculo da imagem e fornece uma borda.

import UIKit

extension UIImage {
    
    func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage {
        
        // code to create the cropped circle with colored border
        
        return newImage
    }
}

Veja aqui o exemplo completo.

Use sua extensão em qualquer lugar do seu projeto

Agora você pode usar seu novo método para essa classe em qualquer lugar em seu código, assim como ele fazia parte da classe padrão.

Aqui está o exemplo do vídeo ( no github ):

import UIKit
class ViewController: UIViewController {
                            
    @IBOutlet var imageView : UIImageView = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let img = imageView.image
        imageView.image = img.cropToCircleWithBorderColor(UIColor(red:0.91, green:0.34, blue:0.16, alpha:1.00), lineWidth: 20)
    }
}

O método cropToCircleWithBorderColornão é uma parte padrão do UIImage, mas como você pode ver, é usado exatamente como antes.

Para um estudo mais aprofundado:

Suragch
fonte
8

Em Swift é chamado de Extensões ! Confira

iSofTom
fonte
Mas extensions não pode incluir variáveis, que tornam as coisas totalmente diferentes.
RnMss
Mesmo em categorias Objective-C não podem ter variáveis ​​(sem hacks).
Valentin Shergin
Os objetos associados ao ObjC não são hacks
malhal
0

Você pode usar o seguinte código em sua classe existente

extension name{
func funcName(){
   } 
}
vikrant tanwar
fonte