Tôi đã tìm thấy một ngoại lệ mà tôi thực sự thích một biến chỉ setter đó là khi tôi đi qua một đóng cửa là tham số duy nhất trong một metho d cho mục đích duy nhất là lưu nó để thực hiện sau này.
tôi thực hiện nó như một phương pháp như sau:
typealias ThemeSetter =() ->()
class Theme {
fileprivate var themeSetters:[ThemeSetter] = []
class var shared: Theme {
struct Singleton {
static let instance = Theme()
}
return Singleton.instance
}
...
func setColor(_ entry:@escaping ThemeSetter) {
entry()
themeSetters.append(entry)
}
}
Sau đó tôi có thể gọi phương thức như sau:
Theme.shared.setColor({
self.navigationBar.barTintColor = Theme.shared.gameBarTint
})
Nhưng tôi không thích paretheses gần sau khung chặt chẽ, kể từ Tôi có thể có nhiều dòng trong việc đóng cửa.
Vì vậy, biết về Trailing đóng cửa Tôi chỉ có thể thay đổi mã để trông như thế này:
Theme.shared.setColor() {
self.navigationBar.barTintColor = Theme.shared.gameBarTint
}
này là hoàn toàn ổn và là cú pháp mà Apple cho thấy cho Trailing đóng cửa. Kể từ khi có chỉ là một tham số và là tối giản rằng tôi Tôi bị cám dỗ để làm cho đoạn code thậm chí gọn nhẹ hơn và giảm nó như thế này:
Theme.shared.setColor {
self.navigationBar.barTintColor = Theme.shared.gameBarTint
}
Đó là một lần nữa làm thế nào Apple cho thấy để làm Trailing đóng cửa; Ngoại trừ, cách này thường được sử dụng cho một số loại Predicate nơi đóng cửa được sử dụng để nói cho phương pháp làm thế nào để làm một loại hoặc khi đóng cửa được sử dụng ở phần cuối của một cuộc gọi chức năng không đồng bộ như là một đóng cửa hoàn thành. Những gì tôi muốn là gán cho việc đóng cửa ... Cái gì đó.
Nếu tôi thay thế các phương pháp để setcolor với một biến nó trông như thế này:
var setColor:ThemeSetter? {
didSet {
if setColor != nil {
setColor?()
themeSetters.append(setColor!)
setColor = nil
}
}
}
Bây giờ cuộc gọi như sau:
Theme.shared.setColor = {
self.navigationBar.barTintColor = Theme.shared.gameBarTint
}
Đó dấu bằng có nghĩa là tất cả sự khác biệt được. Nó cho thấy rằng tôi đang chỉ định một đóng cửa và không chạy một số chức năng sử dụng đóng cửa, mặc dù nó có. : ') < - cần biểu tượng cảm xúc tại đây.
Ghi chú cuối cùng: Điều này thực sự không liên quan gì đến việc đóng cửa, nó chỉ cho bạn thấy cách bạn có thể tạo biến setter, ngoại trừ việc nó vẫn trả về một số không. Nó không có nghĩa là để bảo vệ lớp khỏi việc người dùng truy cập vào biến để đọc giống như một setter thực sự. Ngoài ra, hãy tha thứ cho hướng dẫn về Trailing Closures và Singletons.
Tôi có thể không nhận được đủ Phiếu bầu để trả lời đúng nhưng tại sao câu trả lời chính xác là "Không, bạn không thể! Bạn phải sử dụng cuộc gọi phương thức!". Tôi nói, "Ni" với điều đó, ai cần tất cả cú pháp đó. Chỉ cần sử dụng một biến và không đọc nó trở lại hoặc nếu bạn làm, không có nó trả lại bất cứ điều gì. giống như câu trả lời của Rudolf Adamkovic, có 0 phiếu bầu.
Nope - âm thanh như bạn muốn được tốt hơn off với một phương pháp. –
Hmm Tôi cho rằng đây là điều duy nhất tôi sẽ ghét ngay sau đó! – Aggressor
Khi nào bạn sử dụng các thuộc tính chỉ ghi? Tôi chưa bao giờ có dịp làm như vậy. –