C'è un similar question su come weakify
/strongify
sé, a cui risponde, ma mi chiedo come utilizzare "self", senza verso destra-alla deriva causata da if let
:Come "strongify" optional auto utilizzando guardia Swift 2.0
Welcome to Apple Swift version 2.0 (700.0.59 700.0.72). Type :help for assistance.
2> import Foundation
3> class Foo {
4. func guardOptSelf() ->() throws -> Void {
5. return { [weak self] in
6. guard let self = self else { throw NSError(domain: "I was destroyed!", code: 1, userInfo: nil) }
7. self.doSomethingNonOptionalSelf()
8. }
9. }
10. }
repl.swift:6:19: error: pattern matching in a condition requires the 'case' keyword
guard let self = self else { throw NSError(domain: "I was destroyed!", code: 1, userInfo: nil) }
^
case
repl.swift:6:23: error: binary operator '~=' cannot be applied to two 'Foo?' operands
guard let self = self else { throw NSError(domain: "I was destroyed!", code: 1, userInfo: nil) }
Ah, bello! Non conoscevo la funzionalità della lingua backtick. Sembra che anche questo non sia influenzato dalle impostazioni di avviso del compilatore per ombreggiatura variabile, quali librerie come libextobjc devono sopprimere nella loro implementazione di @ weakify/strongify –
Anche se funziona, non è affidabile in quanto Chris Lattner di Apple lo ha dichiarato come un "bug del compilatore". - e poiché si tratta di un bug, potrebbe essere corretto in futuro: https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160118/007425.html –
Non sono sicuro che io capire completamente la domanda, né la tua risposta. ** 1) ** La domanda è chiedersi 'cosa dovremmo fare se un' sé 'catturato viene espulso prima che sia finito? ** 2) ** Per fare ciò, dobbiamo fare un passo in più, cioè più del normale '[self debole]'. Dovremmo catturarlo usando un riferimento forte come 'guard let' ** 3) ** per rendere le cose belle e fluide usiamo i backtick in modo che' self' venga scartato, perché usare 'weak' converte' self' in un opzionale e noi può anche mantenere lo stesso nome di * self *? – Honey