Sợ hãi chỉ từ từ đặt vào khi tôi nhận ra tôi bắt đầu chạy ra khỏi những bức ảnh này

Swift + Khởi tạo với các bao đóng

Đóng cửa F.T.W.

Lưu ý nhanh - tất cả các bài đăng trong tương lai của tôi sẽ được xuất bản trên trang web chuyên dụng của tôi và ấn phẩm này không còn được cập nhật. Cảm ơn vì đã đọc!

Tôi bắt đầu thực sự đào toàn bộ điệu nhảy khởi tạo trong Swift. Tôi đã viết về nó. Tôi đã viết về lý do tại sao nó thậm chí hoạt động theo cách nó làm. Tôi đã nói về nó Tôi đọc về nó (rất nhiều). Nhưng này, tôi đã quay lại để có thêm một hành động về vấn đề này.

Trong tất cả, nhiều cách hay và đa dạng mà người ta có thể khởi tạo một cái gì đó trong Swift - sử dụng các bao đóng thường không được đưa ra như một phương pháp để làm như vậy. Nhưng than ôi, nó có thể làm cho mã khởi tạo ™ () (bo), ít đau đớn hơn và dễ quản lý hơn một chút.

Dành cho các nhà phát triển giao diện người dùng lập trình ngoài kia - những giao diện này dành cho bạn !

UIKit == UIHugeSetupCode ()

Nhìn kìa, nó không phải lỗi của UIKits. Các thành phần cần được tương tác với người dùng cho vay vào một núi mã thiết lập, bởi vì các tùy chọn. Thông thường, rất nhiều thứ này tự tìm thấy trong viewDidLoad hoặc loadView:

ghi đè func loadView ()
{
    hãy để helloWorldLbl = UILabel ()
    helloWorldLbl.text = NSLocalizedString (Bộ điều khiển của bộ điều khiển.topLbl.helloWorld, nhận xét: Hồi Xin chào thế giới!
    helloWorldLbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    helloWorldLbl.textColor = UIColor.whiteColor ()
    helloWorldLbl.textAlocation = .Center
    self.view.addSubview (helloWorldLbl)
}

Điều này là khá chuẩn cho những người trong chúng ta mạo hiểm vùng biển Cacao Touch mà không có .xib hoặc .storyboard trong tầm nhìn. Mặc dù, nếu bạn chia sẻ tình yêu của tôi đối với các phương thức viewDidLoad hoặc loadView cực nhỏ, bạn có thể tắt nó ở nơi khác.

Nói, một tài sản:

hãy để helloWorldLbl: UILabel = {
    hãy để lbl = UILabel ()
    lbl.text = NSLocalizedString (Bộ điều khiển của bộ điều khiển.topLbl.helloWorld, bình luận:
    lbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    lbl.textColor = UIColor.whiteColor ()
    lbl.textAlocation = .Center
    trả lại lbl
} ()

Đẹp. Trong cuốn sách riêng của Apple về Swift, nó lưu ý rằng, nếu giá trị mặc định của tài sản của bạn yêu cầu một số tùy chỉnh hoặc thiết lập, bạn có thể sử dụng hàm đóng hoặc hàm toàn cầu để cung cấp giá trị mặc định tùy chỉnh cho thuộc tính đó. rất nhiều tùy biến và thiết lập.

Tuy nhiên, một trong những sản phẩm phụ đẹp là cách loadView hiện tại:

ghi đè tải func
{
    self.view.addSubview (self.helloWorldLbl)
}

Tuy nhiên, hãy lưu ý đến các phiên bản () (cuối) trong phần đóng của tờ khai tài sản. Điều này là để cho các trình hướng dẫn Swift nhỏ biên dịch mã của bạn biết rằng cá thể đó đang được gán cho kiểu trả về của bao đóng. Nếu chúng ta bỏ qua điều này, thì có thể chúng ta có thể đã chỉ định đóng cửa thực tế cho trường hợp đó.

Và trong trường hợp này, đó ’s.

Quy định là quy tắc

Mặc dù chúng tôi có một món đồ chơi mới sáng bóng, nhưng bắt buộc phải nhớ các quy tắc của vùng đất. Vì chúng tôi chỉ định một thuộc tính cho một bao đóng, phần còn lại của thể hiện chứa nó có thể chưa được khởi tạo. Do đó, khi việc đóng thực thi - nó không thể tham chiếu các giá trị thuộc tính khác hoặc tự từ bên trong nó.

Ví dụ:

hãy để helloWorldLbl: UILabel = {
    hãy để lbl = UILabel ()
    lbl.text = self.someFunctionToDetermineText () // Lỗi trình biên dịch
    lbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    lbl.textColor = self.myAppTheme.textColor () // Một lỗi khác
    lbl.textAlocation = .Center
    trả lại lbl
} ()

Ví dụ về bản thân có thể không an toàn để sử dụng hoặc có thể không thông qua quy trình khởi tạo hai pha Swift Swift. Điều tương tự cũng đúng với bất kỳ thuộc tính cá thể nào, có thể được phân bổ và khởi tạo kể từ khi đóng thực thi ngay lập tức.

Đây là một bất lợi, nhưng được bảo hành, bất lợi với việc sử dụng các bao đóng để khởi tạo. Mặc dù vậy, nó hoàn toàn có ý nghĩa - và nó phù hợp với một trong ba mục tiêu thiết kế của Swift: an toàn.

Gettin, Dễ thương với Bộ sưu tập

Một lĩnh vực mà tôi đã tìm thấy kỹ thuật này đặc biệt hữu ích là với các trường hợp đại diện cho một trong nhiều hình thức khác nhau của bộ sưu tập trong Swift. Swift Swift có rất nhiều tài năng, cắt và sàng lọc các bộ sưu tập với sức mạnh của một ngàn người khổng lồ là một trong những yêu thích nhất của tôi.

Hãy xem xét ví dụ sau, được lấy từ một trình khởi tạo trong một dự án mà tôi hiện đang làm việc. Lớp chứa mã này có thuộc tính [Nhà phát triển]. Trong một lần khởi chạy mới, tôi đặt các giá trị ban đầu của chúng từ tệp .plist. Sau đó, chúng được lưu trữ thông qua NSKeyedArchiver.

bảo vệ cho devs = NSKeyedUnarchiver.unarchiveObjectWithFile (DevDataManager.ArchiveURL.path!) là? [Nhà phát triển] khác
{
    nhà phát triển tự = {
        hãy để pListData = // Nhận dữ liệu nguyên bản
        var devArray: [Nhà phát triển] = [Nhà phát triển] ()
        // Thiết lập devArray từ dữ liệu nguyên bản
        trả về devArray.map {$ 0.setLocation ()}
                       .filter {$ 0.isRentable}
                       .sort {$ 0.name <$ 1.name}
     } ()
    trở về
}
nhà phát triển tự = devs

Tôi khá thích cách tiếp cận này, bởi vì mặc dù chúng tôi không sử dụng nó bên ngoài trình khởi tạo, nhưng mục đích của mã rất rõ ràng ở chỗ nó chỉ chịu trách nhiệm thiết lập một thuộc tính.

Khi các công cụ khởi tạo và viewDidLoad ghi đè trở nên lớn hơn, việc phân chia những thứ như thế này (ít nhất) là một món quà đáng hoan nghênh về khả năng đọc.

Bắt NSCute

Nếu bạn thực sự đào khởi tạo mọi thứ với một bao đóng, nhưng đang bị thiếu nghiêm trọng khi sử dụng các hàm $ $ trong các mã của bạn, hãy vui lên. Sử dụng một số Swiftery lão luyện, người ta có thể tạo ra một số mã xâm nhập vào kiểu đóng trong chính nó, tạo ra một số cấu hình kiểu pro. Hãy xem xét mã này, lần đầu tiên tôi bắt gặp trên NSHipster luôn có nhiều thông tin:

@warn_unuse_result
công khai func Ban đầu  (giá trị: Loại, khối @noescape: (đối tượng: Loại) -> Vô hiệu) -> Loại
{
    khối (đối tượng: giá trị)
    giá trị trả lại
}

Tôi thích nơi này là đi. Một hàm công khai có một bao đóng với một đối tượng được gõ bằng cách sử dụng tổng quát, sau đó trả về kiểu đó. Điều này có nghĩa là bạn có thể quay lại và khởi tạo mọi thứ với nhiều thông tin loại hơn. Lần lượt mẫu mã đầu tiên của chúng tôi sẽ trông như thế này:

hãy để helloWorldLbl = init (UILabel ()) {
    $ 0.text = NSLocalizedString (Bộ điều khiển.topLbl.helloWorld, nhận xét: Hồi Xin chào thế giới!
    $ 0.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    $ 0.textColor = UIColor.whiteColor ()
    $ 0.textAlocation = .Center
}

Mặc dù có vẻ như nó có vẻ như, nhưng nó thực sự giết chết sự cần thiết của biến đối tượng từ bên trong bao đóng, và nó thoát khỏi yêu cầu của ((). Rất đẹp.

Suy nghĩ cuối cùng

Có thể nói rằng sử dụng một kỹ thuật như vậy là sáu trong một tay, và một nửa tá trong tay kia. Mặc dù nó đúng với các dòng mã được lập trình viên tạo ra phần lớn giống nhau, nhưng tôi lại cho rằng vị trí và tính linh hoạt của nó làm cho nó lý tưởng cho nhiều tình huống.

Đó là một cách thú vị để hoàn thành công việc, và thậm chí có một vài cách để làm điều tương tự ở người bạn cũ Objective-C của chúng tôi. Nhưng này, bạn càng biết nhiều hơn, amirite?

Cho đến nextWeek = {let week = Week () week.advifiedBy (ngày: 7)} ()

Jordan Morgan là một kỹ sư phần mềm iOS, người điều hành Dreaming In Binary

Nếu bạn đã tìm hiểu về việc sử dụng các bao đóng cho bộ khởi tạo, xin vui lòng tiếp tục và NSRecommend (cái này, trong đó: bên dưới);