Chào mừng các  bạn đã quay trở lại với loạt bài viết “Điều gì khiến Swift trở nên hấp dẫn”.  Ở phần 1 trước chúng ta đã tìm hiểu qua một số điểm “quyến rũ” của Swift,  các bạn có thể đọc phần 1 tại đây.

Và hôm nay chúng ta lại tiếp tục khám phá những điểm hấp dẫn của cô nàng chim Yến xinh đẹp này nhé.

Từ khóa Guard

Swift 2 ra đời kèm theo rất nhiều khái niệm mới, trong đó có Guard. Từ khóa Guard khá là quen thuộc với defensive programing, nếu bạn đã từng lập trình Objective-C thì bạn sẽ thấy khái niệm này rất thân quen. Kỹ thuật này giống như một chiếc “cửa thoát hiểm”, giúp bạn thoát ra khỏi tình huống crash càng sớm càng tốt.

Tất cả các dòng lệnh được khai báo sau Guard sẽ phải thỏa mãn các điều kiện được khai báo ngay từ đầu, đồng thời bạn cũng phải khai báo điều gì sẽ diễn ra nếu như các điều kiện không được thỏa mãn. Trước khi Swift ra đời thì chúng ta thường phải làm động tác kiểm thử này qua khối lệnh if-else. Nhưng với Guard thì mọi thứ sẽ trở nên đơn giản hơn nhiều.

Đây là một ví dụ điển hình về guard. Hàm didPressLogin được gọi khi người dùng ấn nút Log In. Chúng ta muốn chắc chắn rằng đối tượng button không khiến chương trình tạo thêm một log in request nào nữa nếu nút Log In được ấn trong khi request hiện tại đã được chạy. Do vậy chúng ta cần phải ngăn chặn điều này xảy ra, sau đó kiểm tra form log in. Nếu form không hợp lệ thì chúng ta cần ghi nhớ rằng sẽ không được log in một lần nào nữa, nhưng quan trọng hơn là chúng ta cần trả về thực thi, ví thế chúng ta không gửi log in request nữa. Khối lệnh guard sẽ thông báo nếu chúng ta không bao gồm lệnh return.

@objc func didPressLogIn(sender: AnyObject?) {
        guard !isPerformingLogIn else { return }
        isPerformingLogIn = true
        
        let email = contentView.formView.emailField.text
        let password = contentView.formView.passwordField.text
        
        guard validateAndShowError(email, password: password) else {
            isPerformingLogIn = false
            return
        }
        
        sendLogInRequest(email, password: password)
    }

Qua ví dụ trên thì ta có thể thấy guard  tập trung xử lý các điều kiện mà bạn không muốn xảy ra, đồng thời bạn sẽ bắt buộc phải xử lý một trường hợp tại một thời điểm. Do đó code sẽ trong sáng và sạch sẽ hơn rất nhiều.

Tập hợp các configuration của subviews lại với nhau bằng cách  sử dụng Shorthand Argument Names

Như đã đề cập ở phần 1 thì tôi có thói quen gộp tất cả các khai báo View vào trong một view Class, từ đó dễ dàng cho việc quản lý cũng như tìm kiếm lỗi. Hồi trước thì tôi có dùng một phương thức lớn là configureView để khởi tạo mọi subview cũng như là config chúng. Nhưng với Swift thì chúng ta có thể sử dụng Closure để làm việc đó.

Chúng ta có một class AwesomeView với 2 subview tên là bestTitleLabel và otherTitleLabel. Cả hai đều được config đầy đủ tại một class. Những thuộc tính config được tập hợp và nhóm lại tại configureView. Nếu tôi muốn thay đổi màu textColor của một label, tôi sẽ biết chính xác phải sửa code ở đâu.

class AwesomeView: GenericView {
    let bestTitleLabel: UILabel = {
        let label = UILabel()
        label.textAlignment = .Center
        label.textColor = .purpleColor()
        
        return label
    }()

    let otherTitleLabel: UILabel = {
        let label = UILabel()
        label.textAlignment = .Left
        label.textColor = .greenColor()
        
        return label
    }()

    override func configureView() {
        super.configureView()

        addSubview(bestTitleLabel)
        addSubview(otherTitleLabel)

        // Configure constraints
    }
}

Điều duy nhất khiến tôi không thích ở đoạn code trên là sự lặp lại của những dòng khai báo label. Tuy nhiên với Then thì mọi thứ sẽ khá hơn đôi chút. Then là một function nhỏ mà bạn có thể thả vào trong project để chạy các khối lệnh khai báo đối tượng, điều này sẽ làm giảm được sự lặp lại các dòng lệnh không cần thiết.

class AwesomeView: GenericView {
    let bestTitleLabel = UILabel().then {
        $0.textAlignment = .Center
        $0.textColor = .purpleColor()tww
    }

    let otherTitleLabel = UILabel().then {
        $0.textAlignment = .
        $0.textColor = .greenColor()
    }

    override func configureView() {
        super.configureView()

        addSubview(bestTitleLabel)
        addSubview(otherTitleLabel)

        // Configure constraints
    }
}

Đó là những gì tôi muốn chia sẻ cho các bạn trong phần 2 này, hẹn gặp lại các bạn vào phần tiếp theo .  

Bài gốc: https://medium.com/@ksmandersen/good-swift-bad-swift-part-2-d6daebf53a5#.81t4dz54m

Techmaster là trung tâm đào tạo lập trình di động từ năm 2011. Chủ trương không cấp bằng, nhưng đào tạo cẩn thận, tỷ mỷ, phương pháp sáng tạo, làm dự án thật, đảm bảo việc làm cho học viên tốt nghiệp.
Lập trình ứng dụng Android thương mại
Lập trình ứng dụng iOS Objective-C
Khóa học iOS Swift 2.x

Khóa học lập trình di động tại Techmaster:

Để cài đặt MacOSX lên phần cứng không phải Apple liên hệ chuyên gia cài Hackintosh:

  • Nguyễn Minh Sơn: 01287065634
  • Huỳnh Minh Sơn: 0936225565
  • Website: caidatmacos.com