2015-12-30 15 views
5

Stavo guardando this video. A 9:40 o giù di lì c'è qualche codice di esempio nella schermata che si presenta come il codice qui sotto:guardia lascia entrare il campo da giuoco veloce 2.0 riceve errore sul collegamento facoltativo ... perché?

//Sieve of Eratosthenes, as seen in WWDC 2015 

func primes(n: Int) -> [Int] { 
var numbers = [Int](2..<n) 
for i in 0..<n-2 { 
    guard let prime = numbers[i] where prime > 0 else { continue } 
     for multiple in stride(from: 2 * prime-2, to: n-2, by: prime) { 
     numbers[multiple] = 0 
     print("\"numbers[i]") 
     } 

    } 
return numbers.filter { $0 > 0 } 
} 

Quando digito che in un parco giochi Xcode, ottengo il seguente errore:

Initializer for conditional binding must have Optional type, not 'Int.'

Perché?

risposta

2

Il "problema" qui è la dichiarazione guard let prime = numbers[i]. Il compilatore si lamenta perché la sintassi guard let prevede che numbers[i] sia un Optional che può essere scartato condizionatamente. Ma non è un optional, puoi sempre recuperare l'i-esimo Int dall'array.

per risolvere il problema è sufficiente scrivere

let prime = numbers[i] 
guard prime > 0 else { continue } 

L'uso corretto del stride appare quindi nel modo seguente (dopo una lunga ricerca nei commenti):

for multiple in (2*prime-2).stride(to: n-2, by: 2*prime-2) { 

pezzo Poi finale è quindi di cambia il print:

print("\(numbers[i])") 
+0

hm se lo faccio, quindi ottengo un errore diverso su la riga 'per più in passo (da: 2 * prime-2, a: n-2, da: prime)' "stride (from: to: by :) non è disponibile. Chiama invece il metodo 'stride' (to: by :). –

+0

@DaveKliman si, ma questo non ha nulla a che fare con la guardia. Non so esattamente quale sia il problema con 'stride', ma il compilatore dice" errore: 'stride (from: to: by :)' non è disponibile: chiama il metodo 'stride (to: by :)' invece " – luk2302

+0

per quanto posso dire che è un elemento di una schiera di Ints, quindi dovrebbe essere un Int, sì? –