Mẹo để trở thành nhà phát triển Swift tốt hơn

Swift cung cấp các tính năng giúp mã nhà phát triển mã an toàn hơn, nhanh hơn, dễ đọc hơn và đáng tin cậy hơn đối với Objective-C. Dưới đây là một số mẹo Swift được phác thảo mà chúng tôi đã thu thập thông qua trải nghiệm của chúng tôi bằng ngôn ngữ mới này (Swift). Họ đã giúp chúng tôi viết mã an toàn và sạch sẽ hơn.

Tôi đã chia cuộc thảo luận này thành hai phần. Trong phần đầu tiên, chúng tôi đang thảo luận cho những người đang bắt đầu với swift và trong phần thứ hai, thảo luận cho những người đã sử dụng.

Lời khuyên cho người mới bắt đầu

1. Sử dụng Sân chơi để Xác thực:

Bất cứ khi nào bạn sẽ thực hiện bất kỳ thử nghiệm logic nào và xác nhận nó trên sân chơi, cũng có thể được sử dụng cho mục đích học tập.
Sân chơi là một công cụ rất dễ dàng và tương tác cho swift. Sân chơi don lồng cần tạo dự án mới. Để tạo sân chơi đơn giản, chọn làm tùy chọn từ khởi chạy Xcode:

Sân chơi cũng có thể được tạo trong Xcode:

Khi bạn đang ở trong sân chơi, có thể viết mã ở bên trái và kết quả sẽ ở bên phải và ở dưới cùng của nó:

2. Sử dụng tùy chọn một cách an toàn:

Một tùy chọn là một thuộc tính có thể có giá trị hợp lệ hoặc không có gì (nil). Bất cứ khi nào chúng tôi sẽ in một tùy chọn. Nó sẽ in giá trị với một số văn bản bổ sung dưới dạng Tùy chọn (giá trị). Chúng ta hoàn toàn có thể hủy bỏ tùy chọn bằng cách sử dụng dấu chấm than (!) Ở cuối tên thuộc tính tùy chọn, nhưng chúng ta nên tránh nó. Điều này được gọi là hủy kết nối mạnh mẽ, dẫn đến sự cố ứng dụng. Vì vậy, sử dụng dấu chấm than (!) Là nguy hiểm.

Có một số điều kiện đặc biệt trong đó dấu chấm than (!) Được sử dụng.
Sai Vì vậy, sẽ rất rủi ro khi sử dụng ngầm định một giá trị tùy chọn.
Chúng ta có thể sử dụng if let mẫu để xử lý việc này:

tên var: Chuỗi? = "Niềm vui"
var LastName: String?
print (name) // Kết quả: Tùy chọn ("Joy")
in (tên!) // Kết quả: Niềm vui
if let value = name {
    in (giá trị)
} khác {
    in ("tên không được đặt")
}
// Kết quả: Niềm vui, vì tên có giá trị
if let lastNameNew = lastName {
    in (LastNameNew)
} khác {
    in ("họ không được đặt")
}
// Kết quả: họ không được đặt, vì LastName không có giá trị nào

3. Quản lý các hằng số trong một tệp duy nhất:

Để quản lý các hằng số của dự án của bạn, hãy tạo một tệp và chỉ quản lý tất cả các hằng số ở đây. Tổ chức tất cả các hằng số trong cấu trúc hoặc một enum như:

enum AppConstants {
   tĩnh hãy để AppName = "MyFirstApp"
   tĩnh hãy để NoINETMessage = "Xin lỗi! Không có kết nối internet"
}

Nó rất hữu ích để quản lý và duy trì khả năng đọc mã của bạn.
Hãy nói rằng bạn đã sử dụng NoINETMessage tại nhiều nơi trong mã ứng dụng của bạn và bây giờ bạn cần thực hiện một số thay đổi trong tin nhắn, sau đó bạn có thể dễ dàng thay đổi tin nhắn chỉ ở một nơi, nó sẽ được phản ánh tự động ở mọi nơi.

4. Sử dụng hàm lồng nhau:

Bạn có thể định nghĩa một hàm với trong các thân của hàm khác, được gọi là hàm lồng nhau.
Các hàm lồng nhau sẽ bị ẩn khỏi thế giới bên ngoài, nhưng có thể được gọi và sử dụng bởi hàm kèm theo của chúng. Một hàm kèm theo cũng có thể trả về hàm lồng nhau của chúng, do đó có thể được sử dụng ở thế giới bên ngoài hoặc phạm vi khác.
Nó sẽ tăng khả năng đọc và sử dụng lại mã của bạn.

func selectStepFunction (lùi: Bool) -> (Int) -> Int {
   func stepForward (đầu vào: Int) -> Int {return input + 1}
   func stepBackward (input: Int) -> Int {return input - 1}
   trở về lạc hậu? stepBackward: stepForward
}
var currentValue = -4
let moveNearerToZero = selectStepFunction (backward: currentValue> 0)
// moveNearerToZero bây giờ đề cập đến hàm stepForward () lồng nhau
trong khi currentValue! = 0 {
   in ("\ (currentValue) ...")
   currentValue = moveNearerToZero (currentValue)
}
in ("không!")
//Kết quả:
// -4...
// -3 ...
// -2 ...
// -1 ...
// số không!
Một lời khuyên cuối cùng cho các bạn, bạn cũng có thể đi cho các chuyên gia lời khuyên.

Lời khuyên cho các chuyên gia

  1. Sử dụng bảo vệ hãy:

Khi bất kỳ hành động nào thực hiện, bạn muốn chắc chắn rằng tất cả các dữ liệu cần thiết có sẵn ở đó để hoạt động đúng. Sau đó, các nhà phát triển thường giải quyết điều này theo hai cách, đó là:

a. Kim tự tháp diệt vong:

Khi nhà phát triển muốn chắc chắn cho từng dữ liệu cần thiết, hãy xác thực từng thuộc tính được sử dụng, như:

tên người dùng var: Chuỗi?
email var: Chuỗi?
mật khẩu var: Chuỗi?
var chính sách Được chấp nhận: Bool = false
func checkAndSave () {
   if let uname = userName {
      nếu để mail = email {
         nếu để pwd = mật khẩu {
            nếu chính sách được chấp nhận {
               // làm điều tuyệt vời, như đăng ký
            }
         }
      }
   }
}

Nó được gọi là kim tự tháp của sự diệt vong vì chúng ta tạo ra kim tự tháp của các điều kiện.

b. Trả lại có điều kiện:

Sau này trên các kim tự tháp của sự diệt vong, các nhà phát triển đã chuyển đổi nó thành lợi nhuận có điều kiện, xác thực cho từng thuộc tính được sử dụng và trả lại, như:

func checkAndSave () {
   if let uname = userName {return}
   nếu để mail = email {return}
   if let pwd = password {return}
   nếu chính sách được chấp nhận {return}
   
   // làm điều tuyệt vời, như đăng ký
}

Nó được gọi là lợi nhuận có điều kiện bởi vì chúng tôi trở lại trên mỗi điều kiện thất bại.
- Giải pháp đầu tiên là không tốt theo nghĩa dễ đọc và gỡ lỗi mã, vì vậy chúng tôi sẽ không đi theo nó.
- Giải pháp thứ hai cũng không đủ tốt, bởi vì không cần thiết phải trả về từ chức năng, có thể nhận được rằng tại sao chúng tôi đã trả lại nó không?
- Một giải pháp khác, chúng ta có thể sử dụng if let nhưng nó cũng có một số hạn chế vì phạm vi của biến sẽ nằm trong khối if, do đó, nó sẽ lại tiếp tục tham gia vào kim tự tháp.

Vì vậy, ở đây có khái niệm về let let, được giới thiệu trong swift 2.0. Nó rất đơn giản và dễ sử dụng, các điều kiện và các câu lệnh let có thể được sử dụng cùng nhau, có thể được sử dụng như:

func checkAndSave () {
bảo vệ cho uname = userName, hãy để mail = email, hãy để pwd = mật khẩu, chính sách được chấp nhận khác {
   trở về
}
// làm điều tuyệt vời, như đăng ký
}

2. Sử dụng khối trì hoãn:

defer là một khối, có nghĩa là một số hướng dẫn tôi muốn thực hiện sau này cho dù đó là gì? Nó có thể chứa một dòng mã hoặc một loạt các dòng mã. Chúng ta có thể định nghĩa một khối trì hoãn trong một hàm sẽ được gọi một cách thách thức khi việc thực thi hàm kết thúc. Nó làm giảm sự dư thừa mã là tốt.
- Giả sử, bạn đang tạo một đối tượng của bất kỳ tài nguyên nào trong hàm và sử dụng từ khóa bảo vệ để kiểm tra một cái gì đó hoặc trả lại sự thực thi từ bất kỳ điều kiện nào thì tài nguyên của bạn sẽ nằm trong bộ nhớ hoặc bạn phải giải phóng nó trước khi hoàn thành việc thực thi chức năng. Vì vậy, nó sẽ dẫn đến sự dư thừa mã hoặc do nhầm lẫn, bạn có thể để tài nguyên trong bộ nhớ. Để tránh tình trạng này, chúng ta có thể viết mã giải phóng tài nguyên trong khối trì hoãn. như:

func processFile (tên tệp: String) ném {
   nếu tồn tại (tên tệp) {
      hãy để tập tin = mở (tên tệp)
      // khối defer được xác định ở đây để đóng tệp đang mở
      hoãn lại {
         Đóng tập tin)
      }
      hãy để userName = getUserName ()
      bảo vệ userName! = "" other {return}
      file.write (tên người dùng)
      hãy để userAge = getUserName ()
      bảo vệ người dùngAge> = 18 người khác {return}
      file.write (userAge)
      
      // close (file) được gọi ở đây, ở cuối phạm vi.
   }
}

3. từ khóa:

Trước đó trong swift nếu bạn muốn sử dụng khớp mẫu với điều kiện thì bạn phải sử dụng hai câu lệnh if riêng biệt, như:

var webUrl: Chuỗi? = "https://medium.com"
if let path = webUrl {
   if path.hasPrefix ("https") {
      // làm điều tuyệt vời
   }
}

Sau đó, Swift đã giới thiệu từ khóa trong phiên bản 2.0 để làm điều tương tự trong một câu lệnh, như:

if let path = webUrl where path.hasPrefix ("https") {
   // làm điều tuyệt vời
}

Bây giờ, Swift đã thay thế từ khóa bằng dấu, (dấu phẩy), như:

if let path = webUrl, path.hasPrefix ("https") {
   // làm điều tuyệt vời
}

Vì vậy, nơi nào được sử dụng đầy đủ hơn. Đọc thêm về nơi.

4. Làm cho phái đoàn tùy chỉnh yếu:

Chờ đợi những gì là yếu và đại biểu? Hãy để kiểm tra nó trên nhà phát triển apple để xác định chính xác.
Một tham chiếu yếu là một tham chiếu không giữ vững đối tượng mà nó đề cập đến, và do đó không ngăn ARC xử lý đối tượng được tham chiếu.
Phân quyền là một mẫu thiết kế cho phép một lớp hoặc cấu trúc xử lý (hoặc ủy thác) một số trách nhiệm của nó đối với một thể hiện của loại khác.

Bất cứ khi nào bạn chỉ định đại biểu của bất kỳ lớp A nào trong lớp B, thì bạn đang giữ tham chiếu mạnh mẽ của lớp A trong lớp B và lớp A cũng sẽ giữ tham chiếu mạnh mẽ của lớp B là đại biểu. Vì vậy, nó sẽ theo chu kỳ giữ lại cho các đối tượng và sẽ có các vấn đề liên quan đến bộ nhớ và ứng dụng sẽ gặp sự cố.

Vì vậy, lần tới khi bạn sẽ tạo các đại biểu tùy chỉnh của mình, thì hãy đảm bảo tạo chúng như một tài liệu tham khảo yếu, như:

giao thức myCustomDelegation: class {
   func newFunction (vaueToBeShare: String)
}
lớp A {
   đại biểu var yếu: myCustomDelegation?
   // làm cho đại biểu yếu đi để phá vỡ chu trình giữ lại
}
lớp B: myCustomDelegation {
   nội bộ func newFunction (vaueToBeShare: String) {
      // làm gì đó ở đây khi đại biểu bị sa thải
   }
   let obj = A () // giữ tham chiếu mạnh mẽ của lớp A
   trong đó() {
      obj.delegate = self // gán lớp A cho đại biểu của lớp B
   }
}

5. Bỏ qua sử dụng KVO:

KVO (Khóa quan sát giá trị khóa), nơi bạn có thể đặt và quan sát cho bất kỳ khóa nào và hành động khi giá trị của khóa đó thay đổi. Đó là cách tiếp cận tốt nhưng không tốt hơn trong swift bởi vì đôi khi chúng ta quên loại bỏ người quan sát sẽ dẫn đến sự cố ứng dụng, hoặc các nhà quan sát luôn phát sóng để nó đau đớn đầy đủ để xử lý.

Chúng tôi có một sự thay thế cho KVO nhanh chóng, đó là người quan sát tài sản. Sử dụng nó, chúng ta có thể nhận được hành động khi giá trị thuộc tính sẽ thay đổi. Có :

  • will Set được gọi ngay trước khi giá trị được lưu trữ.
  • did set được gọi ngay sau khi giá trị mới được lưu trữ.
lớp newClass {
   var myNewObj: Int = 0 {
      will set (newValue) {
         in ("newValue = \ (newValue), oldValue = \ (myNewObj)")
      }
 
      didset {
         in ("oldValue = \ (oldValue), currentValue = \ (myNewObj)")
      }
   }
}
hãy để obj = newClass ()
obj.myNewObj = 5
// Kết quả: newValue = 5, oldValue = 0
// Kết quả: oldValue = 0, currentValue = 5
obj.myNewObj = 8
// Kết quả: newValue = 8, oldValue = 5
// Kết quả: oldValue = 5, currentValue = 8

Các trình quan sát will set và did set cho myNewObj được gọi bất cứ khi nào thuộc tính được gán một giá trị mới. Điều này đúng ngay cả khi giá trị mới giống với giá trị hiện tại.

Nếu bạn đang thay đổi giá trị của property1 trong trình quan sát thuộc tính của property2 và property2 trong trình quan sát thuộc tính của property1, thì nó sẽ tạo ra một chuỗi, đưa ra lỗi thực thi xấu trong thời gian chạy, không có gì nói ra trong thời gian biên dịch.

6. Sử dụng nhiều bảng phân cảnh:

Bảng phân cảnh là hình ảnh đại diện cho giao diện người dùng của ứng dụng iOS, hiển thị màn hình nội dung và các kết nối giữa các màn hình đó.
Xcode theo mặc định tạo một bảng câu chuyện và các nhà phát triển sử dụng nó cho ứng dụng hoàn chỉnh, vì vậy nó trở thành một con quái vật và tăng thời gian tải cho dự án của bạn trong Xcode cũng như thời gian khởi chạy ứng dụng của bạn trên thiết bị,
Vì vậy, hãy cố gắng tạo nhiều bảng phân cảnh trong ứng dụng của bạn.

Sử dụng bảng phân cảnh cho một câu chuyện hoàn chỉnh không dành cho một dự án hoàn chỉnh

Khi chúng tôi đang sử dụng nhiều bảng phân cảnh, chúng tôi có thể tạo bộ điều khiển xem theo nhiều cách, để đọc sâu bài viết này về việc sử dụng nhiều bảng phân cảnh.
Nhiều bảng phân cảnh có thể được sử dụng như:

enum AppStoryboards: Chuỗi {
   trường hợp Chính = "Chính"
   trường hợp PreLogin = "PreLogin"
   ví dụ var: UIStoryboard {
      trả về UIStoryboard (tên: self.rawValue, bundle: nil)
   }
}
// SỬ DỤNG :
hãy để Storyboard = AppStoryboard.Main.instance
hãy để loginVC = AppStoryboard.PreLogin.instance.instantiateViewCont kiểm soát (withIdentifier: "LoginVC")
// Cách cũ
let Storyboard = UIStoryboard (tên: Chính Main, bó: Bundle.main)

7. Bỏ qua sử dụng Globals:

Đó là một cách thực hành tốt để sử dụng các biến và hàm toàn cầu, có thể giúp chúng tôi tạo mã sạch và tăng khả năng sử dụng lại mã. Nhưng tôi sẽ tốt hơn để sử dụng phần mở rộng cho cùng. Bởi vì bằng cách tạo ra một lớp Toàn cầu, chúng tôi đang tạo ra một lớp GOD của Chúa. Vì vậy, hãy phân chia các tác vụ của lớp Toàn cầu bằng cách sử dụng các tiện ích mở rộng, sẽ giúp mã sạch hơn, dễ đọc hơn và có thể sử dụng lại.

Như:

// Thực hành trung bình
hình vuông func (x: Int) -> Int {return x * x}
Đặt hình vuông3 = hình vuông (x: 3) // In: 9
hình vuông (x: vuông3) // In: 81
// Thực hành tuyệt vời
mở rộng Int {
   var vuông: Int {return self * self}
}
3. hình vuông // In: 9
3. hình vuông.số // In: 81

Nhận một số tiện ích mở rộng từ GitHub.

8. Sử dụng gen:

Generics cho phép bạn khai báo một biến, khi thực thi, có thể được gán cho một tập hợp các loại được xác định bởi chúng tôi.

// Thực hành trung bình
var stateName = ["Uttar Pradesh", "Kerala", "Assam", "Punjab"]
var areaArray = [240928, 38863, 78438, 50362]
tăng trưởng var = [20.1, 4.9, 16.9, 13.7]
func printStateName (obj: [String]) {print ("stateNames: \ (obj)")}
func printStateArea (obj: [Int]) {print ("khu vực: \ (obj)")}
func printStateGrowth (obj: [Double]) {print ("tăng trưởng dân số: \ (obj)")}
printStateName (obj: stateName)
printStateArea (obj: areaArray)
printStateGrowth (obj: tăng trưởng)
// Thực hành tuyệt vời
func printArray  (_ obj: T, message: String = "") {print ("\ (tin nhắn) \ (obj)")}
printArray (stateName, message: "stateNames:")
printArray (areaArray, message: "area:")
printArray (tăng trưởng, thông điệp: "tăng trưởng dân số:")

Cảm ơn bạn đã đọc, vui lòng nhấn biểu tượng giới thiệu nếu thích bộ sưu tập này