Kategori için hızlı sınıf nasıl oluşturulur?


84

Mevcut swift sınıfımdan bir kategori oluşturmak istiyorum, ancak IDE'de bunu yapma seçeneği yok.

Swift projesinde kategori olup olmadığına dair bir fikriniz var mı? Veya hızlı projede benzer işlevsellik nasıl elde edilir?


2
aradı extension.
holex

Yanıtlar:


128

Swift'de, Extensionsmevcut sınıflara, yapılara ve numaralandırma türlerine yeni işlevler eklemek için kullanabilirsiniz .

Amaç-C kategorilerinden birkaç yönden farklılık gösterirler, özellikle:

  • Onlar adlandırılmamış
  • Bir Uzantıyı açıkça içe aktarmanıza gerek yoktur. Mevcut bir türe yeni işlevsellik eklemek için bir uzantı tanımlarsanız, yeni işlev, uzantı tanımlanmadan önce oluşturulmuş olsalar bile, bu türün tüm mevcut örneklerinde kullanılabilir olacaktır.
  • Yukarıda belirtildiği gibi, sadece sınıflarla değil, diğer türlerle de çalışırlar.

Bugünkü haliyle, Uzantılar şunları yapabilir:

  • Hesaplanmış özellikler ve hesaplanmış statik özellikler ekleyin
  • Örnek yöntemlerini ve tür yöntemlerini tanımlayın
  • Yeni başlatıcılar sağlayın
  • Abonelikleri tanımlayın
  • Yeni iç içe türler tanımlama ve kullanma
  • Mevcut bir türü bir protokole uygun hale getirin

Bir uzantıyı bildirmek için temel sözdizimi aşağıdaki gibidir:

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

Kontrol Apple'ın belgelerine Swift Uzantılar'ı nasıl kullanılacağı konusunda daha fazla bilgi için.


99

Amaç C'de bunlara kategoriler denirdi , ancak Swift'de bunlara uzantılar denir . Her ikisinin de amacı, alt sınıflar oluşturmak zorunda kalmadan mevcut sınıflara ek işlevsellik sağlamaktır.

Belgelerde uzantılar hakkında bir şeyler okudum, ancak bu eğitim videosunu ( YouTube sürümü , github kaynağı ) izleyene kadar projemde nasıl kullanılacağını gerçekten anlamadım .

İşte bunun nasıl yapılacağına dair videodan alınan bir özet.

Projenize bir Swift dosyası ekleyin

  • Proje Gezgini'ne sağ tıklayın ve "Yeni Dosya ..." seçeneğini seçin.

  • "Swift Dosyası" nı seçin

  • Kural, dosya adını genişletmekte olduğunuz sınıf adı artı ("+" işaretiyle) ona yaptığınız şeyi kaydetmektir. Örneğin, "UIImage + Kırpma".

Uzantının kodunu yazın

Yeni oluşturduğunuz yeni Swift dosyasını açın.

İçe olmalıdır UIKit(yerine Foundationbir uzatıyoruz ise) UIView. Ardından extension, uzatmak istediğiniz sınıf adından önce anahtar kelimeyi kullanın . Daha sonra sınıfa kendi yeni yöntemlerinizi ekleyebilirsiniz. (Not, uzantılar yeni yöntemler eklemek içindir, mevcut yöntemleri geçersiz kılmak için değildir - dolayısıyla adı.)

Videoda örnek, görüntüden bir daire kesen ve ona bir kenarlık veren bir yöntem eklemekti.

import UIKit

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

Tam örnek için buraya bakın .

Uzantınızı projenizin herhangi bir yerinde kullanın

Artık, standart sınıfın bir parçası olduğu gibi, bu sınıf için yeni yönteminizi kodunuzun herhangi bir yerinde kullanabilirsiniz.

İşte videonun örneği ( github'da ):

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)
    }
}

Yöntem cropToCircleWithBorderColorstandart bir parçası değil UIImageama gördüğünüz gibi tıpkı olduğu gibi kullanılıyor.

Daha fazla çalışma için:



0

Mevcut sınıfınızda aşağıdaki kodu kullanabilirsiniz

extension name{
func funcName(){
   } 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.