Tôi có một đóng cửa với một bản thân yếu, tôi cần phải đảm bảo rằng bản thân sẽ được giữ lại trong khi thực hiện đóng cửa, và được giải phóng bằng cách đóng cửa sau khi thực hiện xong. Trước đây nó được thực hiện bởi @strongify. Có cách nào khác để làm điều đó trong Swift không?Làm thế nào để đạt được hành vi tương tự như với việc củng cố trong Swift?
Trả lời
Trong khi câu trả lời khác làm việc, tùy chọn khác là sử dụng backticks. Làm như vậy không cần phải xác định strongSelf
và cho phép sử dụng self
mà không phải tự tháo rời tùy chọn.
let c:() -> Void = {
[weak self] in
guard let `self` = self else {
throw NSError(domain: "self was destroyed", code: 1, userInfo: nil)
}
self.doSomethingNonOptionalSelf()
}
Sử dụng biến cục bộ để thiết lập tham chiếu mạnh mẽ đến self
.
let c:() -> Void = {
[weak self] in
// assign unwrapped optional to another variable
guard let strongSelf: TypeOfSelf = self else {
return // or throw an exception, up to you
}
strongSelf.doSomething()
}
Ý tưởng hay, nhưng mã có thể tốt hơn. Một 'self' yếu tự động là một tùy chọn, và gán nó vào một địa phương (ngầm) mạnh làm cho địa phương trở thành một tùy chọn, quá. Vì bạn đang thử nghiệm cho non-nil, bạn có thể súc tích hơn với câu lệnh 'if let'. – rickster
@rickster, cảm ơn các đề xuất có giá trị của bạn. –
Tôi đã hỏi [câu hỏi liên quan] (http://stackoverflow.com/questions/32588431/how-to-strongify-optional-self-using-guard-in-swift-2-0) về cách sử dụng 'guard' trong tình hình để bóng 'self'. Sẽ đánh giá cao câu trả lời ở đó –
Trả lời trên một câu hỏi cũ để nâng cao một thành ngữ tôi chưa thấy có rất nhiều người đưa lên: bạn có thể sử dụng withExtendedLifetime
để đảm bảo rằng các yếu self
sẽ không biến mất vào bạn.
let c:() -> Void = {
[weak self] in
withExtendedLifetime(self) {
self!.doSomething()
}
}
Lưu ý rằng mặc dù withExtendedLifetime
đảm bảo rằng đối số sẽ không bị hủy diệt trước khi gọi đóng cửa của nó là xong, tranh cãi vẫn còn một tùy chọn, vì vậy bạn phải Unwrap nó.
Tài liệu tham khảo:
Không có lý do cho các wrapper biến cho phép nếu bạn sử dụng withExtendedLifetime. –
- 1. iOS: Cách đạt được hành vi như startActivityForResult của Android
- 2. Làm thế nào để củng cố nhiều thư mục ẩn svn với Subversion 1.7+
- 3. Làm thế nào tôi có thể thực hiện hành vi tương tự như Dictionary.TryGetValue
- 4. Spark đạt được thứ tự sắp xếp như thế nào?
- 5. Làm thế nào để làm cho hành vi có hành vi khác trong phản ứng chuối
- 6. Mercurial - Làm việc với hàng đợi tương tự như giá?
- 7. React Router - Làm thế nào để đạt được điều hướng giống như tab?
- 8. như thế nào iOS Swift Runtime làm việc
- 9. Làm thế nào để làm việc với các thao tác bit trong Swift?
- 10. Làm thế nào để đạt được tải chậm với RequireJS?
- 11. Làm thế nào để so sánh bình đẳng trong SQL với hành vi giống như C#?
- 12. ternary điều hành tương tự như:?
- 13. Làm thế nào để có được Sleep (0) giống như hành vi trong Linux
- 14. Tự động làm việc trong Spring như thế nào?
- 15. Làm thế nào để gọi [tự mới] trong Swift
- 16. git: làm thế nào để "củng cố" các cam kết địa phương
- 17. Củng cố hàng trùng lặp
- 18. làm thế nào để đạt được phân trang trong lucene?
- 19. Làm thế nào để đạt được Asp.net MVC OneWay/FireAndForget gọi như WCF không?
- 20. Củng cố WPF Styles chung
- 21. Facebook đạt được cuộn vô hạn như thế nào?
- 22. Củng cố IP vào dãy trong python
- 23. Làm thế nào tôi có thể đạt được kết hợp này của hành vi StackPanel và UniformGrid?
- 24. ZeroMQ: làm thế nào để đạt được sự đa luồng giống như C
- 25. Hành vi "việc làm" lạ trong zsh
- 26. Làm thế nào để đạt được vào cuối của TextArea
- 27. Củng cố ASP.NET MVC Controller Dependencies (StructureMap)
- 28. Thư viện học tập C++ Củng cố
- 29. Làm thế nào để đạt được tự động đăng xuất trong php?
- 30. đăng nhập rèn củng cố sửa chữa
Bạn có thể đưa ra ví dụ về mã không? Tôi không chắc điều này là cần thiết trong Swift. –
@NateCook Tôi không phải là một fan hâm mộ của '@ weakify' và' @ strongify' macro và chắc chắn họ chưa bao giờ thực sự đạt được sự chấp nhận rộng rãi. Do đó, tôi không đồng ý với sự tổng quát của Nikita về cách mà "trước đây nó đã được thực hiện". Bản mẫu 'weakSelf' /' strongSelf' cơ bản, mặc dù chắc chắn có các ứng dụng của nó trong cả Objective-C và Swift. Tôi nghĩ câu trả lời của Swipesight minh họa độc đáo cách người ta sẽ làm điều đó trong Swift. – Rob