2015-09-05 10 views
5

Appena aggiornato a swift 2.0 e si sta verificando un errore.'array' non è disponibile: creare una matrice dalla sequenza lazy: Array (...) errore

L'errore che sto ottenendo è: 'allineamento' non è disponibile: si prega di costruire un array dalla sequenza di pigro: Array (...)

Il mio codice è:

  if let credentialStorage = session.configuration.URLCredentialStorage { 
      let protectionSpace = NSURLProtectionSpace(
       host: URL!.host!, 
       port: URL!.port?.integerValue ?? 0, 
       `protocol`: URL!.scheme, 
       realm: URL!.host!, 
       authenticationMethod: NSURLAuthenticationMethodHTTPBasic 
      ) 
// ERROR------------------------------------------------↓ 
      if let credentials = credentialStorage.credentialsForProtectionSpace(protectionSpace)?.values.array { 
// ERROR------------------------------------------------↑ 
       for credential: NSURLCredential in (credentials) { 
        components.append("-u \(credential.user!):\(credential.password!)") 
       } 
      } else { 
       if let credential = delegate.credential { 
        components.append("-u \(credential.user!):\(credential.password!)") 
       } 
      } 
     } 

Would qualcuno sa come convertire questa riga di codice da aggiornare per Swift 2.0?

if let credentials = credentialStorage.credentialsForProtectionSpace(protectionSpace)?.values.array

+0

Quale versione è la vostra Xcode? – pixyzehn

+0

Funziona nel mio parco giochi. – pixyzehn

+0

@pixyzehn questa è la versione 7 beta 6 – Bills

risposta

9

Come afferma errore, si dovrebbe costruire Array. Prova:

if let credentials = (credentialStorage?.credentialsForProtectionSpace(protectionSpace)?.values).map(Array.init) { 
    //... 
} 

In Swift1.2, values su Dictionary<Key, Value> rendimenti LazyForwardCollection<MapCollectionView<[Key : Value], Value>> tipo che ha .array proprietà ritorno Array<Value>.

In Swift2, values su Dictionary<Key, Value> rendimenti LazyMapCollection<[Key : Value], Value>, e la proprietà .array è abbandonato a causa possiamo costruire Array con Array(dict.values).

In questo caso, poiché credentialStorage?.credentialsForProtectionSpace(protectionSpace)?.values termina con il tipo Optional, non possiamo semplicemente Array(credentialStorage?.cre...). Invece, se vuoi un Array, dovremmo usare map() su Optional.

Ma, in questo caso particolare, è possibile utilizzare credentialStorage?.credentialsForProtectionSpace(protectionSpace)?.values così com'è.

Prova:

if let credentials = credentialStorage?.credentialsForProtectionSpace(protectionSpace)?.values { 
    for credential in credentials { 
     //... 
    } 
} 

Questo funziona perché LazyMapCollection conforme alle SequenceType.

+1

'(dict.keys) .map (Array.init)' non ha funzionato per me (sono finito con errori di inferenza di 'Element') ma' [MyType] (dict.keys) 'ha funzionato (trovato qui: http://stackoverflow.com/a/32243072/63582) – wmmeyer

0

Utilizzare l'inizializzazione a Swift 2,0

guard let values = credentialStorage?.credentialsForProtectionSpace(protectionSpace)?.values else { return } 
let credentials = Array<NSURLCredential>(values) 
for credential in credentials { 
    // `credential` will be a non-optional of type `NSURLCredential` 
}