Styling kode Anda di Swift
Apa itu Gaya?
Gaya pengkodean adalah bagaimana kode Anda terlihat, polos dan sederhana atau rumit seperti permainan kata teka-teki. Gaya pengkodean mungkin berbeda dari pengembang ke pengembang sesuai dengan preferensi dan kemudahan mereka sendiri. Anda dapat menemukan gaya dan konvensi pengkodean hanya dengan mengamati kode yang sudah ada di ruang kerja Anda oleh pengembang senior atau rekan Anda atau Anda dapat menemukan gaya pribadi Anda sesuai dengan preferensi Anda.
Mengapa kita membutuhkan gaya?
Jawaban pertama dan sederhana untuk pertanyaan ini adalah membuat kode Anda lebih mudah dibaca. Siapa yang tidak ingin kode mereka terlihat indah dan mudah dibaca. Gaya juga penting jika Anda ingin mempertahankan kode Anda selama bertahun-tahun dan di antara banyak pengembang dalam tim.
Berikut adalah beberapa hal yang saya pertimbangkan selama pengkodean. Ini adalah pendapat pribadi saya dan Anda mungkin setuju atau tidak setuju dengan pendapat saya. Tolong beri tahu saya melalui komentar mengapa Anda tidak setuju dengan pendapat saya sehingga saya juga bisa tahu lebih banyak tentang alternatif pendapat saya.
Apa yang harus Anda pertimbangkan selama pengkodean?
File Sumber
File sumber harus diberi nama dengan mempertimbangkan peran atau entitasnya. File sumber yang terkait dengan modul yang sama harus dikelompokkan agar mudah ditemukan saat dibutuhkan. Mengikuti praktik ini membantu pengembang untuk dengan cepat menemukan file yang terkait dengan modul yang harus mereka ubah atau kerjakan.
Konvensi penamaan
Penamaan deskriptif dan konsisten membuat perangkat lunak lebih mudah dibaca dan dipahami.
- menggunakan camelCase bukan snake_case
- menggunakan UpperCamelCase untuk kelas, tipe, enum, dan protokol, lowerCamelCase untuk yang lainnya
- termasuk semua kata yang diperlukan sambil menghilangkan kata-kata yang tidak perlu
- menggunakan nama berdasarkan peran, bukan tipe
- menggunakan istilah yang tidak mengejutkan para ahli atau membingungkan pemula
- memilih nama parameter yang bagus yang berfungsi sebagai dokumentasi
- mengambil keuntungan dari parameter default
Konstanta didefinisikan menggunakan kata kunci let dan variabel dengan kata kunci var . Selalu gunakan let daripada var jika nilai variabel tidak akan berubah.
Tip: Teknik yang baik adalah mendefinisikan semuanya menggunakan let dan hanya mengubahnya menjadi var jika kompiler mengeluh!
Opsional
Deklarasikan variabel sebagai opsional dengan ? di mana nilai nil dapat diterima setiap kali variabel tidak ditugaskan selama deklarasi.
Gunakan membuka bungkus secara implisit dengan ! hanya untuk variabel instan yang Anda tahu pasti akan diinisialisasi nanti sebelum digunakan. Lebih suka pengikatan opsional daripada opsi yang dibuka secara implisit di sebagian besar kasus lainnya.
Saat mengakses nilai opsional, gunakan rangkaian opsional jika jenis non-opsional diperlukan selama eksekusi.
Jenis
Selalu gunakan tipe dan ekspresi asli Swift jika tersedia. Swift menawarkan menjembatani ke Objective-C sehingga Anda masih dapat menggunakan kumpulan metode lengkap jika diperlukan.
- Gunakan String di atas NSString
- Gunakan Kamus melalui NSDictionary
- Gunakan Array di atas NSArray
Swift tidak memerlukan titik koma setelah setiap pernyataan dalam kode Anda. Mereka hanya diperlukan jika Anda ingin menggabungkan beberapa pernyataan dalam satu baris.
Tip: Jangan menulis banyak pernyataan pada satu baris yang dipisahkan dengan titik koma.
Jarak
Kurung metode dan kurung kurawal lainnya ( if / else / switch / while dll.) harus selalu terbuka pada baris yang sama dengan pernyataan tetapi tutup pada baris baru.
Tips: Anda dapat mengindentasi ulang dengan memilih beberapa kode (atau Command+A untuk memilih semua) lalu Control+I (atau Editor ▸ Structure ▸ Re-Indent di menu)
Pilihan:
if number % 2 == .zero {
print("Even number")
} else {
print("Odd number")
}
if number % 2 == .zero
{
print("Even number")
}
else
{
print("Odd number")
}
- Seharusnya tidak ada baris kosong setelah kurung kurawal buka atau sebelum kurung kurawal penutup kecuali dalam deklarasi kelas / pernyataan kesesuaian protokol.
- Tanda kurung tutup seharusnya tidak muncul pada baris itu sendiri.
let user = getUser(of: userID,
on: connection)
let user = getUser(
of: userID,
on: connection
)
Pilihan:
let dict: [String: Any] = ["id": 1, "name": "Mukesh Shakya"]
let dict: [String : Any] = ["id" : 1, "name":"Mukesh Shakya"]
Kode yang tidak digunakan (mati), termasuk kode template Xcode dan komentar placeholder harus dihapus.
Pilihan:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModels.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return viewModels.count
}
impor hanya modul yang dibutuhkan file sumber. Jangan pernah mengimpor modul untuk digunakan di masa mendatang. Misalnya, menghindari impor UIKit saat mengimpor Foundation sudah cukup. Demikian juga, jangan mengimpor Foundation jika Anda harus mengimpor UIKit .
Pilihan:
import Foundation
var name: String?
import UIKit
var name: String?
Avoid using self since Swift does not require it to access an object’s properties or invoke its methods. Use self only when required by the compiler (in @escaping closures, or in initializers to differentiate properties of class or struct from arguments). In other words, if it compiles without self then omit it.
Function Declarations
Keep function declarations short on one line including the opening brace. For functions with long signatures, put each parameter on a new line.
Preferred:
func signup(email: String,
password: String,
confirmPassword: String,
additionalParams: [String: Any]?,
completion: @escaping (Result<String, Error>) -> Void)
func signup(email: String, password: String, confirmPassword: String, additionalParams: [String: Any]?, completion: @escaping (Result<String, Error>) -> Void)
Function Calls
Similar approach while declaring a function, follow same approach while calling the functions too. For functions with long signatures, put each parameter & their values on a new line together.
Preferred:
service.signup(email: email ?? "",
password: password ?? "",
confirmPassword: confirmPassword ?? "") { result in
switch result{
case success (let authModel):
print(authModel)
case .failure(let error):
print(error.localizedDescription)
}
}
Lebih suka kode yang ringkas dan biarkan kompiler menyimpulkan tipe untuk konstanta atau variabel dari instance tunggal sambil mendeklarasikan serta menetapkan nilainya di baris yang sama.
Pilihan:
let message = "Namaste!"
let message: String = "Namaste!"
Pilihan:
var numbers: [Int] = []
var numbers = [Int]()
Operator Ternary ?: , seharusnya hanya digunakan ketika meningkatkan kejelasan atau kerapian kode. Satu kondisi biasanya semua yang harus dievaluasi. Mengevaluasi banyak kondisi, biasanya lebih dari satu, biasanya lebih dapat dipahami sebagai pernyataan if else. Secara umum, penggunaan terbaik dari operator ternary adalah selama penugasan variabel dan memutuskan nilai mana yang akan digunakan.
Pilihan:
let alertControllerStyle: UIAlertController.Style = UIDevice.current.userInterfaceIdiom == .pad ? .alert : .actionSheet
let result = a > b ? (c > d ? c : d) : y
Saat membuat kode dengan persyaratan, margin kiri kode harus menjadi jalur "emas" atau "bahagia". Yaitu, jangan bersarang jika pernyataan. Beberapa pernyataan pengembalian tidak apa-apa. Pernyataan penjaga dibuat untuk ini.
Pilihan:
guard let firstNumber = firstNumber else {
fatalError()
}
//some code using firstNumber
guard let secondNumber = secondNumber else {
fatalError()
}
// other code using firstNumber and secondNumber
if let firstNumber = firstNumber {
if let secondNumber = secondNumber {
let sum = firstNumber + secondNumber
print(sum)
} else {
fatalError()
}
} else {
fatalError()
}
if let firstNumber = firstNumber,
let secondNumber = secondNumber {
let sum = firstNumber + secondNumber
print(sum)
} else {
fatalError()
}
guard let firstNumber = firstNumber,
let secondNumber = secondNumber else {
fatalError()
return
}
let sum = firstNumber + secondNumber
print(sum)
if let firstNumber = firstNumber {
if let secondNumber = secondNumber {
let sum = firstNumber + secondNumber
print(sum)
} else {
fatalError()
}
} else {
fatalError()
}
Tanda kurung di sekitar persyaratan tidak diperlukan di swift dan harus dihilangkan
Pilihan:
if number % 2 == .zero {
print("Even number")
}
if (number % 2 == .zero) {
print("Even number")
}
Kesesuaian Protokol
Saat menambahkan kesesuaian protokol ke kelas, lebih baik menambahkan ekstensi terpisah untuk metode protokol. Ini membuat metode terkait dikelompokkan bersama dengan protokol dan dapat menyederhanakan instruksi untuk menambahkan protokol ke kelas dengan metode terkaitnya. Juga biasakan menandai kesesuaian.
Pilihan:
import UIKit
class MyViewController: UIViewController {
private lazy var tableView: UITableView = {
let tableView = UITableView()
tableView.dataSource = self
return tableView
}()
}
// MARK: UITableViewDataSource
extension MyViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 22
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
}
import UIKit
class MyViewController: UIViewController, UITableViewDataSource {
private lazy var tableView: UITableView = {
let tableView = UITableView()
tableView.dataSource = self
return tableView
}()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 22
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
}
Pilihan:
import UIKit
class MyTableViewController: UITableViewController {
var viewModels: [String] = []
}
// MARK: UITableViewDataSource
extension MyTableViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModels.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
}
import UIKit
class MyTableViewController: UITableViewController {
var viewModels: [String] = []
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModels.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
}

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































