2014-11-15 22 views
13

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?

+0

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. –

+2

@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

Trả lời

20

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() 
} 
6

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() 
} 
+3

Ý 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

+0

@rickster, cảm ơn các đề xuất có giá trị của bạn. –

+0

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 ở đó –

6

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:

  1. Swift Standard Library Functions
  2. The Weak/Strong Dance in Swift
+0

Không có lý do cho các wrapper biến cho phép nếu bạn sử dụng withExtendedLifetime. –

Các vấn đề liên quan