Tam Objective-C Uygulamasını Swift'e Dönüştürmek için Adım Adım Kılavuz
Yayınlanan: 2018-03-142014'te piyasaya sürülmesinden bu yana, Apple'ın programlama dili Swift olağanüstü bir büyüme yaşadı. Programlama dili, selefi Objective-C ile aynı konumu paylaşarak , Top 10 Programlama dilleri arasında yerini almayı başardı . Ancak hızlı ve objektif-C arasındaki savaş asla yumuşamaz.
Popülaritedeki bu artış ve heyecan verici özellikler ile daha önce Obj-C ile çalışan birçok iOS uygulama geliştiricisi Swift programlama diline geçiş yaptı. Aslında, iOS için Swift veya Objective-C mücadelesinde, LinkedIn, Yahoo Weather, Hipmunk ve Lyft gibi çeşitli iOS uygulamaları Objective-C'den Swift'e yükseltildi, birçoğu bir Objective-C uygulamasını dönüştürmeyi planlıyor Swift'e.
SWIFT'İ DAHA İYİ BİR SEÇENEK YAPAN FAKTÖRLER
Şahsen, Swift'in ilk versiyonunun piyasaya sürülmesinden bu yana evrimini gördüm ve Swift ile C arasında Swift'in, aşağıdaki gibi faktörlere dayanarak Objective-C'nin yerini aldığını söyleyebilirim.
Açık kaynak
Swift, açık kaynaklı bir dildir ve Swift kodu, Objective-C'nin şimdiye kadar olduğundan çok daha fazla platformda taşınabilir olabilir.
Hız
iOS geliştirme için Swift, LLVM derleyicisi ile çalışan ve mevcut kodu yeniden kullanabilen, kullanılmayan kaynakları ortadan kaldırabilen, satır içi işlevleri yönetebilen, vb. statik tipte bir dildir. Ayrıca, C++'ın en hızlı algoritma hesaplama aritmetiğine dayalı çalışması, öncekine göre rekabet avantajına sahip olduğunu kanıtlıyor.
Apple'ın iddialarına ve benim yaşadıklarıma göre Swift arama algoritması Objective-C'den 2,6 kat daha hızlı.
okunabilirlik
Objective-C'den farklı olarak Swift, C temellerine bağlı değildir. iOS geliştiricilerine iç içe yöntem çağrılarını kaldırma, satırın sonundaki noktalı virgülü atlama, bir anahtar kelimenin başına @ koymaktan kaçınma, "+" işaretini kullanarak dizeyi birleştirme vb. gibi konularda yetki verir. Ayrıca, Swift sınıfı bölümlere, arayüze ve uygulamaya ayrılmamıştır. Bu, kod uzunluğunu neredeyse yarıya indirdi ve daha okunaklı hale getirdi.
Örneğin, Lyft uygulaması sıfırdan Swift dilinde yeniden yazıldığında, uygulama kodu 75.000'den 25.000 satıra düştü. Bu etkileyici rakamlar, uygulamanın müşteri tarafında performansını etkilemeden geliştiricilerin çabalarını azaltıyor.
Etkileşimli Kodlama
Oyun Alanları özelliği ile, geliştirme aşaması boyunca geri bildirim toplarken programcıların bir yığın kod veya algoritma yazmasına izin verir. Swift kodu veri görselleştirmeleri kullanılarak yazıldığından, bu uygulama geliştirme sürecini daha kolay ve ulaşılabilir hale getirir.
Emniyet
Swift, mevcut pazar trendlerine göre bir uygulama oluşturmak için daha güvenli ve daha güvenli bir dildir. Sözdizimi ve dil yapısı, Objective-C dilinde kodlama yaparken yaygın olarak görülen hata türlerini hariç tutmuştur. Bu, uygulama çökmesi olasılığının ve sorunlu davranış vakalarının daha az olduğu anlamına gelir.
Objective-C durumundan farklı olarak, Swift ile yazılan kod derlenebilir ve kod yazma kısmı ile birlikte hatalar giderilebilir. Bu nedenle Swift, Objective-C kodunu test etme süreciyle karşılaştırıldığında, test sürecinde daha iyi ve daha hızlı hareket eder.
Bakım onarım
Swift, selefi gibi C'ye bağımlı olmadığından, Swift uygulaması geliştirmesi durumunda bakım çok daha kolaydır. Swift'i iOS uygulama geliştirmenin geleceği yapan bir şey .
Objective-C kullanarak bir iOS uygulaması oluşturma durumunda, geliştiricilerin derleme süresini ve kod verimliliğini artırmak için iki farklı kod dosyası tutması gerekiyordu. Ancak Swift, Objective-C başlığını (.h) ve uygulama dosyalarını (.m) tek bir dosyada (.swift) birleştirerek bu iki dosyalı mekanizmayı bıraktı. LLVM derleyicisi, iOS uygulama geliştiricileri için büyük bir avantaj olan Swift dosyasını okurken bağımlılıkları otomatik olarak keşfeder.
Yukarıda bahsedilen faktörlerin dışında, Swift'i diğer Apple programlama diline tercih etmenin kayda değer yararı, Objective-C ile uyumluluğudur. Apple, uygulama geliştiricilerine aynı projede her iki dili de kullanma olanağı sundu. Bu, yalnızca Swift kullanarak sıfırdan bir iOS uygulaması geliştirmek için değil, aynı zamanda Objective-C kodunu kullanarak mevcut uygulamalarını Swift'e yükseltmek için de yararlıdır.
Artık iki iOS uygulama geliştirme dili arasındaki felsefi farklılıklara aşina olsanız da, pratik uygulama sırasındaki farklılıklara geçelim.
HEDEF-C'YE KARŞI SWIFT: IOS GELİŞTİRME TİTANLARI ARASINDAKİ BÜYÜK FARKLAR
Karmaşık Objective-C kod tabanı ve Swift kod tabanı ile olan deneyimim sayesinde, uygulama geliştirme sürecini hızlı hale getiren çeşitli yeni unsurlara giriş ile birlikte mevcut konseptlerde çeşitli yükseltmelerle karşılaşacaksınız. Lafı uzatmadan, hızlı ve objektif c savaşında yeni/farklı bulacağınız her şeye bir göz atalım.
Opsiyonel
Swift vs Objective-C performansı hakkında konuştuğumuzda, Obj-C'de sıfır değeri elde etmek için sıfır nesneler üzerinde yöntemleri çağırabiliriz. Beklenmeyen sıfır değeri durumunda tanımsız davranışı anlamak için sıfır kontrollerini manuel olarak yapmalıyız. Ancak bu sorun, Swift kodunda tanıtılan yeni bir kavram olan Opsiyonel kullanılarak çözülebilir. İsteğe bağlı, anlamlı bir değer döndüremeyebilecek işlevlerin isteğe bağlı veya sıfırda kapsüllenmiş bir değer döndürmesine izin verir.
İsteğe bağlı tür bildirmenin Sözdizimi şöyledir:
Genel numaralandırma İsteğe bağlı<Sarılmış> :_Reflectable, NilLiteralConvertible
Pratik olarak, Wrapped türünde bir değere veya var olmayan bir değere sahip olabilir.
Swift, türleri isteğe bağlı olarak bildirmek için sözdizimsel şekeri işler, böylece İsteğe Bağlı<String> öğesini String?
İsteğe bağlı kapsayıcıdan sarılmış değer elde etmenin başlıca iki yolu vardır:
İsteğe Bağlı Zincirleme: if-let koşullu ifadesinin yalnızca varsa bir değer alacağı durumlarda kullanılır.
Zorunlu Sarma: İsteğe bağlı bildirilen değişken sıfır olmadığında kullanılır. Değer varsa, koşulları uygulamadan çıktıyı sağlayacaktır. Ancak, diğer durumda, çökecek.
Ayrıca Swift dilinde String olarak bildirilmiş, örtük olarak açılmamış seçenekleri de bulabiliriz!
Örneğin:
Sınıf XSınıf
{
var aString: String
var bString: String!
var cString: String?
Başlat (dize: Dize)
{
aString = dize
}
}
Burada,
Bir String asla sıfır olamaz. Nesne başlatma sırasında bu değişkenin bir değere sahip olması çok önemlidir, aksi takdirde program çökmeye neden olur.
B String sıfır olabilir. Ancak, nil nesnesine erişmeye çalışırsanız program çökecektir.
C String sıfır olabilir ve normal bir isteğe bağlı değişken olarak ele alınması gerekir.
Uzantılar
Obj-C'de bulunan uzantılar ve kategoriler, Swift dilinde uzantılar olan tek bir varlıkta birleştirilir. Uzantılar, zaten var olan bir sınıfa, numaralandırmaya, yapıya veya protokole yeni işlevler ekler ve en iyi yanı, türleri genişletmek için orijinal kaynak koduna erişiminizin gerekmemesidir.
demetler
Opsiyonellerin yanı sıra, Apple'ın yeni geliştirme dilinde tanıtılan bir başka yeni veri türü de Tuples. Tuple'ların (yerinde kullanıcı tanımlı veri tipi) temel olarak birçok değeri tek bir bileşik grup halinde grupladığı düşünülür. Bir yerde bir model oluşturmanın aşırıya kaçabileceğini ve sözlüğün yeterince okuyucu dostu olmadığını düşünüyorsanız, dikkate alınması gereken doğru bir unsurdur. Daha fazla Tuple öğrenmek için bu bloga bakın.
jenerik
Generics, Swift programlama dilinin en çarpıcı özelliklerinden biridir ve aslında Swift standart kitaplıklarının çoğu Swift koduyla oluşturulmuştur. Genel kod, geliştiricilerin, tanımlanan gereksinimlere tabi olarak, farklı tür kümeleriyle çalışabilen esnek, yeniden kullanılabilir işlevler ve türler yazmasına olanak tanır. Bu, çoğaltma riskini en aza indirir ve net, soyut bir yaklaşımla kodun okunabilirliğini artırır.
Tecrübelerime göre, Generics'i ilk başta elde etmek zor, tıpkı özyinelemeler gibi. Ancak, elinize aldığınızda, yorucu mantıksal sorunları çözmenin yepyeni bir dünyasını çözebileceksiniz.
numaralandırma
Objective-C kodunda, numaralandırmalar ilkel türlerle sınırlıdır. Çıktıyı görüntülemek için tamsayı numaralandırma değerlerini dizelerinkiyle eşleştirmek için, bir dizi tanıtmanız veya anahtar kontrol yapısına doğru dönmeniz gerekir. Ancak Swift iOS uygulama geliştirme dili ile bu sorunları yaşamanıza gerek yok.
Swift, daha fazla seçenekle çeşitli yeni numaralandırmalar sunar. Swift numaralandırmaları ilişkili değerlere sahip olabilir ve Swift numaralandırma durumu önceden tanımlanmış bir dizi alanı tutabilir. Aslında, Swift numaralandırmaları özyinelemeli olabilir ve ham değerleri depolayabilir.
Örneğin:
Abonelikler
Abonelikler, bir yöntem kullanmadan sınıflardaki, numaralandırmalardaki ve yapılardaki bir diziden, koleksiyondan veya listeden bilgilere erişmek için bir araç olarak görülebilir. Saklamak ve almak için ayrı yöntemler oluşturmadan dizine göre değerleri ayarlamak ve almak için abonelikleri düşünebilirsiniz. Örneğin, bir Array örneğindeki öğelere someArray[index] olarak ve bir Dictionary örneğindeki öğelere someDictionary[key] olarak erişebilirsiniz.
Bir Subscript bildirmek için sözdizimi aşağıdaki gibidir:
alt simge (dizin: Int) -> Int {
almak {
// indis değeri bildirmek için
}
ayarla (yeniDeğer) {
//değerleri tanımlamak için
}
}
Tür Çıkarımı
Swift ayrıca, bir değişkenin belirli bir türle bildirildiğinde türünün statik ve değiştirilemez olacağı iOS uygulama geliştirme için tür güvenliği önerdi. Derleyici, atadığınız değerler temelinde değişkeninizin ne tür olacağını belirleyecektir (veya çıkarımını yapacaktır).
Örneğin:
Burada, bir str2 değişkenine sayısal değerlerle başlatmaya çalıştığınızda derleyici bir hata gösterecektir (aşağıya bakın)
Fonksiyonlar
Swift programlama dilindeki İşlev sözdizimi, karmaşık Objective-C kod stiline göre tanımlanması daha esnektir. Swift'de her işlevin, işlevin parametre türlerinden oluşan bir türü vardır ve bu, bir değişkene işlev atayabileceğiniz veya onu diğer işlevlere bir değer olarak iletebileceğiniz anlamına gelir (aşağıdaki örnekte gösterildiği gibi):
Bunun dışında Swift, uygulama geliştiricilerinin işlevsel parametrelere varsayılan değerler tanımlamasına da izin verir.
Hata yönetimi
Swift, çalışma zamanında kurtarılabilir hataları atmak, yakalamak, dağıtmak ve işlemek için tamamen yeni bir yaklaşım sunar. Swift'de hata işleme hakkında bir fikir edinmek için bloga bakın.
Bunların dışında Swift uygulama geliştirmeyi Objective-C uygulama geliştirmeye karşı kazan-kazan haline getiren çeşitli kavramlar şunlardır:
Modeller
Swift durumunda, modeller sınıflardan ziyade yapılar olarak tercih edilir.
protokoller
Apple WWDC videolarının ilkinde Swift, “Protokol odaklı dil” olarak tanıtıldı. Bir protokol, belirli bir göreve/işlevsellik parçasına uyan yöntemlerin, özelliklerin ve diğer varlıkların bir planı olarak tanımlanabilir. Bu gereksinimlerin fiili olarak uygulanmasını kolaylaştırmak için bir sınıf, numaralandırma veya yapı tarafından benimsenebilirler ve varsayılan uygulamalar sağlama, jenerikleri birleştirme vb. özellikleriyle Obj C'ye kıyasla çok daha güçlüdürler.
Bir iOS uygulama geliştiricisi olarak, gelişmiş Apple'ın programlama dilinin avantajlarından yararlanmak için bir sınıfı en etkili uygulama olarak tanımlamadan önce bir protokol oluşturmayı tercih ediyorum.
Fonksiyonel Programlama Yaklaşımı
Swift, geliştiricilere sıradan sorunları çözmek için geleneksel döngüler veya referans türleri kullanmaktan daha fazla işlevsel yaklaşım kullanma yetkisi verir. Burada bakış açısı, geleneksel yaklaşımda olduğu gibi çözümün nasıl elde edileceğini belirlemek yerine, bir sorunu çözümün ne olduğu açısından analiz etmektir.
Her iki iOS diliyle olan deneyimimden, fark ettiğim bir şey, Objective-C'deki döngüleri kullanarak yinelemelerle yaptığımız şeyin Swift'de Filtre, Harita ve Azaltma kavramı kullanılarak yapılabileceğidir. İşlevsel programlamadaki bu üst düzey işlevler hakkında derinlemesine bilgi almak için bloga bakın.
FULL OBJECTIVE-C UYGULAMASINI SWIFT'E DÖNÜŞTÜRMEK İÇİN ADIM ADIM KILAVUZ
Bugün, bir uygulamayı Objective-C'den Swift'e satır satır dönüştürmek için çeşitli araçlar var. Ancak hiçbirini kullanmamanızı tavsiye ederim. Her iki iOS dili birlikte çalışabilir olsa da, program paradigmaları farklıdır. Bir uygulamayı Obj-C'den Swift'e doğrudan geçirmek, yanlış paradigmaları kullanma riskini artıracaktır. Bu konuyu detaylandıralım.
Swift, öncekinden farklı olarak, büyük ölçüde değişmezliğe dayanmasını sağlayan işlevsel programlama paradigmasından etkilenir. Örneğin, diziler ve sözlükler hakkında konuşursanız - bu temel modeller Objective-C'de bir referans türü olarak kullanılır, ancak Swift'de değer türüdür, dolayısıyla değişmez. Bu, Obj-C kodunu herhangi bir araç kullanarak bilinçaltında Swift'e dönüştürmenin, hata ayıklaması zor birçok hatayla karşılaşmanıza neden olacağı anlamına gelir. Ayrıca Swift, algoritmaları/yaklaşımları daha verimli hale getiren ve programları daha hızlı hale getiren tonlarca yeni özelliğe (yukarıda açıklandığı gibi) sahiptir! Aslında, Apple'ın Obj-C'yi yükseltmek yerine yeni bir dil ortaya çıkarmasının ana nedeni budur. Tüm bu noktaları göz önünde bulundurarak, Obj-C'den Swift'e satır satır dönüştürmeye gitmek yerine, herkesin Swift'de sıfırdan yeni bir uygulama yazmasını şiddetle tavsiye ediyorum.
Yine de, tam bir Objective-C uygulamasını Swift'e dönüştürmek istiyorsanız, kullanabileceğiniz bir araç Swiftify'dır. Araç, Obj-C kodunu tek bir tıklamayla Apple'ın yeni programlama diline yükseltme sürecini kolaylaştırıyor; binlerce çalışma saatinden tasarruf. Birlikte çalışabilirlik özelliği, dönüştürülmüş iOS kodunu herhangi bir güçlük yaşamadan Objective-C'ye geri entegre etmenizi sağlar; bu, Swift'in sunduğu sayısız seçeneği keşfedebileceğiniz ve ardından her şeyi bir kerede yeniden yazmadan onu Obj-C projenize geri entegre edebileceğiniz anlamına gelir.
Mevcut uygulama kodunuzu Dönüşüm için hazırlayın
En son Obj-C koduyla başlamak her zaman daha iyidir. Bunun nedeni, Xcode'un size şu konularda yardımcı olabilecek modern bir Objective-C dönüştürücüsüne sahip olmasıdır:
1. Kimliği mümkün olan her yerde instancetype olarak değiştirme
2. Doğru numaralandırma makrolarını kullanma
3. Daha yeni @property sözdizimine yükseltme
Dönüştürücü, olası değişiklikleri analiz etme ve uygulama mekaniğine yardımcı olurken, kodun anlamını göstermez. Bu nedenle, tüm iOS uygulama geliştiricilerinin her şeyi bir kez manuel olarak gözden geçirmeleri ve ardından değişiklikleri onaylamaları önerilir.
Dönüştürücüyü kullanmak için Düzenle -> Yeniden Düzenleyici -> Modern Amaç-C sözdizimine değiştir'i seçin.
Objective-C kodunu Swift'e geçirme süreci
Tam bir Objective-C uygulamasını Swift'e dönüştürmek için en etkili yaklaşım, her seferinde bir sınıf, özellikle Obj-C'de Swift sınıflarını alt sınıflara ayıramayacağınız için herhangi bir alt sınıfı olmayan bir sınıfla başlamaktır.
Sınıfla ilgili .m ve .h dosyalarını tek bir .swift dosyasıyla değiştirin. Bununla, arayüzden uygulamaya kadar her şey otomatik olarak Swift dosyasına girecektir. Ayrıca, gerekirse Xcode otomatik olarak bir başlık oluşturduğundan bir başlık dosyası oluşturmanıza gerek yoktur.
Bir Köprüleme Başlık Dosyası Tasarlama
İlk .swift dosyanızı eklediğinizde, aşağıda gösterilene benzer bir istem bulacaksınız.
' Köprü Başlığı Oluştur ' seçeneğine tıklayın.
Adım Adım Kılavuz
1. Swift'e dönüştürmek istediğiniz bir çift .h ve .m dosyası seçin. Tüm projeyi dönüştürmek istiyorsanız, AppDelegate sınıfını sonraya bırakın.
2. Kod boyunca #import “MyViewController.h” dosyasını arayın ve bunu Objective-C Bridging Başlık Dosyasından ([MyProject]-Bridging-Header.h) kaldırın.
3. Tüm .m dosyalarındaki #import “[dosyaadı].h” örneklerini #import “[MyProject]-Swift.h” ile değiştirin ve dosyaya #import “[dosyaadı].h” yerine @class [dosyaadı] yazın. tüm .h dosyaları.
4. Obj-C dosyalarının bir kısmını Swift'e dönüştürün. Bu, 'Xcode için Swiftify'ın Finder uzantısı kullanılarak kolayca yapılabilir. Aksi takdirde, .m ve .h dosyalarının içeriğini .swift'e kopyalayın ve Swiftify Xcode Uzantısında bulunan "Dosyayı Swift'e Dönüştür" seçeneğini kullanın.
5. Projedeki .h ve .m dosyalarını dönüştürülmüş .swift dosyalarıyla değiştirin.
6. Projeyi derleyin ve dönüştürme hatalarını düzeltin. Xcode otomatik düzeltme önerileri kullanılarak birçok sorun kolayca yönetilebilirken, projede birkaç kez görünen hataları rapor edip düzeltmek için Swiftify'a da güvenebilirsiniz.
7. Tamamlandığında, projeyi oluşturun ve çalıştırın. 'Sınıf Bulunamadı' sorunu ortaya çıkar ve ardından kilitlenirse, bununla ilgili tüm referansları Storyboard Düzenleyici'de bulun. Identity Inspector'a sınıf adını tekrar girin, kaydedin ve tekrar deneyin.
8. Tüm projeyi dönüştürüyorsanız, şimdi AppDelegate sınıfını dönüştürebilirsiniz. Bu noktada, diğer tüm dosyalar Swift'e dönüştürülmüştür ve böylece hedefte hiç Obj-C dosyası kalmamışsa, main.m ve .pch(önceden derlenmiş başlık) dosyasını kolayca silebilirsiniz.
Hangi uygulamayı tercih edersiniz - Swift'de sıfırdan yeni bir iOS uygulaması oluşturun veya Objective-C'yi tamamen Swift'e dönüştürün? Aşağıdaki yorum bölümü aracılığıyla görüşlerinizi paylaşın.