@ Matt ha i dettagli, ma c'è una (un po 'orribile po' impressionante,) soluzione. (Vedi modifica sotto, però)
let window = app.delegate?.window??.`self`()
Lascerò la comprensione di questa riga di codice come esercizio per il lettore.
OK, mento, abbattiamolo.
app.delegate?.window
OK, finora tutto bene. A questo punto abbiamo il UIWindow??
che ci sta dando un mal di testa (e credo sia un bug
in Swift
disconnetti tra Swift e Cocoa). Vogliamo collassarlo due volte. Possiamo farlo con il concatenamento opzionale (?.
), ma che si apre e riavvolge, quindi siamo tornati da dove siamo partiti. È possibile anche double-optional-chain, con ??.
che è bizzarro, ma funziona.
Questo è ottimo, ma ??
non è un operatore di suffisso legale. Devi effettivamente concatenare a qualcosa. Bene, vogliamo ricondurre a se stesso (cioè "identità"). Il protocollo NSObject
ci fornisce un metodo di identità: self
.
self
è un metodo su NSObject
, ma è anche una parola riservata in Swift, quindi la sintassi perché è `self`()
E così otteniamo la nostra follia sopra. Fatelo come volete
Nota che dal ??.
funziona, questo non è tecnicamente necessario. Puoi semplicemente accettare che view
è UIWindow??
e utilizzare ??.
su di esso come view??.frame
. È un po 'rumoroso, ma probabilmente non crea problemi reali per i pochi posti in cui dovrebbe essere necessario.
(*) Ero solito considerare questo come un bug in Swift, ma non è risolvibile direttamente tramite concatenamento opzionale. Il problema è che non esiste alcun concatenamento opzionale dopo lo window
. Quindi non sono sicuro di dove sia il posto giusto per sistemarlo. Swift potrebbe consentire a un suffisso - ?
di "appiattire" senza richiedere il concatenamento, ma ciò sembra strano. Immagino che l'operatore giusto sarebbe interrobang delegate?.window‽
: D Sono sicuro che non causerebbe alcuna confusione.
EDIT:
Joseph Lord pointed out the better solution (che è molto simile alle tecniche ho usato per evitare banali se-lasciare, ma non aveva pensato a questo modo prima):
let window = app.delegate?.window ?? nil // UIWindow?
Io sono d'accordo con lui che questa è la risposta giusta.
Non lo è: 'finestra var opzionale: UIWindow? {get set} '- il tuo' delegate' è opzionale-chained (usando '?'), che si traduce in un altro livello di optionals. –
Ma anche quando metto! a destra del delegato invece, dà ancora ?? – Arbitur
Domanda simile qui: http://stackoverflow.com/questions/25175544/uiwindow-does-not-have-member-named-bounds. –