Dimungkinkan untuk menambahkan ekstensi ke jenis objek Swift yang ada menggunakan ekstensi, seperti yang dijelaskan dalam spesifikasi bahasa .
Akibatnya, dimungkinkan untuk membuat ekstensi seperti:
extension String {
var utf8data:NSData {
return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
}
}
Namun, apa praktik penamaan terbaik untuk file sumber Swift yang berisi ekstensi tersebut?
Di masa lalu, konvensi digunakan extendedtype+categoryname.m
untuk tipe Objective-C seperti yang dibahas dalam panduan Objective-C . Tetapi contoh Swift tidak memiliki nama kategori, dan memanggilnya String.swift
sepertinya tidak tepat.
Jadi pertanyaannya adalah: mengingat String
ekstensi di atas , apa yang harus disebut file sumber cepat?
ios
objective-c
swift
xcode
AlBlue
sumber
sumber
ClassName+ExtensionName
format, dan yang saya tidak melihat terlalu banyak orang masih menggunakan. Selain itu, saya menemukan bahwa kikuk sebagai pengganti hanya mendefinisikan kelas dan ekstensi bersama, atau memberikan nama file yang lebih baikFooAbleTypes
dan mendefinisikan contoh dalam agregat.Extensions.swift
. Dengan begitu, Anda tidak akan kehilangan jejak mereka dan pendatang baru ke basis kode akan segera menyadarinya. Dan saya lebih suka menyimpan ekstensi satu kali untuk file yang mereka perlukan.Jawaban:
Sebagian besar contoh yang saya lihat meniru pendekatan Objective-C. Ekstensi contoh di atas adalah:
String+UTF8Data.swift
Keuntungannya adalah bahwa konvensi penamaan memudahkan untuk memahami bahwa itu adalah ekstensi, dan Kelas mana yang sedang diperluas.
Masalah dengan menggunakan
Extensions.swift
atau bahkanStringExtensions.swift
adalah bahwa tidak mungkin untuk menyimpulkan tujuan file dengan namanya tanpa melihat isinya.Menggunakan
xxxable.swift
pendekatan seperti yang digunakan oleh Java berfungsi baik untuk protokol atau ekstensi yang hanya mendefinisikan metode. Tetapi sekali lagi, contoh di atas mendefinisikan atribut sehinggaUTF8Dataable.swift
tidak masuk akal secara tata bahasa.sumber
ExtendedType+Functionality.swift
, apakah praktik yang baik untuk mengurutkan semuaString
ekstensi, misalnya, ke dalam subfolder mereka sendiri (yaituString
atauString Extensions
) di bawahExtensions
folder? Atau lebih baik menyimpan semua file ekstensi pada level yang sama di bawahExtensions
folder?Tidak ada konvensi Swift. Sederhana saja:
Saya membuat satu file untuk setiap kelas yang saya perpanjang. Jika Anda menggunakan satu file untuk semua ekstensi, itu akan dengan cepat menjadi hutan.
sumber
Saya lebih suka
StringExtensions.swift
sampai saya menambahkan terlalu banyak hal untuk membagi file menjadi sesuatu sepertiString+utf8Data.swift
danString+Encrypt.swift
.Satu hal lagi, menggabungkan file serupa menjadi satu akan membuat bangunan Anda lebih cepat. Rujuk ke Mengoptimalkan-Cepat-Build-Times
sumber
Jika Anda memiliki perangkat tambahan umum dan aneka yang disetujui tim, menyatukannya sebagai Extensions.swift berfungsi sebagai solusi tingkat pertama Keep-It-Simple. Namun, saat kompleksitas Anda tumbuh, atau ekstensi menjadi lebih terlibat, diperlukan hierarki untuk merangkum kompleksitas. Dalam keadaan seperti itu saya merekomendasikan praktik berikut dengan sebuah contoh.
Saya memiliki kelas yang berbicara dengan back-end saya, dipanggil
Server
. Itu mulai tumbuh lebih besar untuk mencakup dua aplikasi target yang berbeda. Beberapa orang menyukai file besar tetapi secara logis terpisah dengan ekstensi. Preferensi saya adalah menjaga setiap file relatif singkat sehingga saya memilih solusi berikut.Server
awalnya sesuaiCloudAdapterProtocol
dan menerapkan semua metodenya. Apa yang saya lakukan adalah mengubah protokol menjadi hierarki, dengan membuatnya merujuk pada protokol bawahan:Di
Server.swift
saya milikiServer.swift
kemudian hanya mengimplementasikan API server inti untuk mengatur server dan mendapatkan versi API. Karya nyata dibagi menjadi dua file:Ini menerapkan protokol masing-masing.
Ini berarti Anda harus memiliki deklarasi impor di file lain (untuk Alamofire dalam contoh ini) tetapi ini adalah solusi bersih dalam hal memisahkan antarmuka dalam pandangan saya.
Saya pikir pendekatan ini bekerja sama baiknya dengan kelas yang ditentukan secara eksternal serta Anda sendiri.
sumber
Mengapa ini bahkan menjadi perdebatan? Haruskah saya meletakkan semua sub-kelas saya ke dalam file yang disebut _Subclasses.swift. Saya pikir tidak. Swift memiliki spasi nama berbasis modul. Untuk memperluas kelas Swift yang terkenal membutuhkan file yang khusus untuk tujuannya. Saya dapat memiliki tim besar yang membuat file yang UIViewExtensions.swift yang menyatakan tidak ada tujuan dan akan membingungkan pengembang dan dapat dengan mudah diduplikasi dalam proyek yang tidak akan dibangun. Konvensi penamaan Objective-C berfungsi dengan baik dan sampai Swift memiliki spasi nama asli, itu adalah cara terbaik untuk melakukannya.
sumber
Daripada menambahkan komentar saya di semua tempat, saya memunculkan semuanya di sini dalam satu jawaban.
Secara pribadi, saya mengambil pendekatan hybrid yang memberikan baik kegunaan dan kejelasan, sementara juga tidak mengacaukan area permukaan API untuk objek yang saya perpanjang.
Misalnya, apa pun yang masuk akal untuk tersedia untuk string apa pun akan masuk
StringExtensions.swift
sepertitrimRight()
danremoveBlankLines()
.Namun, jika saya memiliki fungsi ekstensi seperti
formatAsAccountNumber()
itu tidak akan masuk dalam file itu karena 'Nomor Akun' bukanlah sesuatu yang secara alami berlaku untuk semua / semua string dan hanya masuk akal dalam konteks akun. Dalam hal ini, saya akan membuat file bernamaStrings+AccountFormatting.swift
atau mungkin bahkanStrings+CustomFormatting.swift
denganformatAsAccountNumber()
fungsi jika ada beberapa jenis / cara untuk memformatnya.Sebenarnya, dalam contoh terakhir itu, saya secara aktif mencegah tim saya untuk menggunakan ekstensi seperti itu di tempat pertama, dan sebagai gantinya akan mendorong sesuatu seperti
AccountNumberFormatter.format(String)
bukan yang tidak menyentuhString
area permukaan API sama sekali, sebagaimana seharusnya. Pengecualiannya adalah jika Anda mendefinisikan ekstensi itu di file yang sama di mana ia digunakan, tapi itu tidak akan memiliki nama file itu sendiri.sumber
Saya lebih suka harus
+
menggarisbawahi fakta bahwa itu berisi ekstensi:String+Extensions.swift
Dan jika file terlalu besar, Anda dapat membaginya untuk setiap tujuan:
String+UTF8Data.swift
String+Encrypt.swift
sumber