2014-12-24 14 views
16

Sto cercando di utilizzare una struttura pubblicaPerché è necessario scrivere l'inizializzatore per struct in Swift per poterlo utilizzare nei test unitari?

public struct Person { 
    public let name: String 
} 

in una prova di unità (XCTest):

let person = Person(name: "Paul") 

Test Build esito negativo con l'errore:

'Person' cannot be constructed because it has no accessible initializers.

Al fine di costruire la test Devo scrivere un inizializzatore per la struct. Non mi sembra giusto perché le strutture hanno già degli inizializzatori. Qualcuno ha una soluzione migliore?

Xcode versione 6.1.1 (6A2008a)

+0

Credo che il problema è: come 'nome' è una costante, si deve inizializzare un valore per esso. –

risposta

15

Questo è stato risolto di Swift 2.0 con l'attributo @testable.

Se si importa il modulo nei test con @testable, gli inizializzatori sintetizzati diventeranno visibili ai test.

potete trovare una breve intro per @testablehere.

+0

Questa è stata la soluzione con l'uso di 'structs' in Playground. Bella scoperta. – Nick

42

Il problema è che l'automaticamente sintetizzato initialiser che si ottiene con una struct è sintetizzato come internal, il che significa che non è possibile accedere da un altro modulo.

I test di unità correntemente vengono eseguiti in un altro modulo, quindi non possono vedere l'inizializzatore. Come Ben-G fa notare nella sua risposta, questo è affrontato a partire da Swift 2.0 con l'attributo @testable.

Fa parte della frattura generale dei test unitari nei progetti Swift. Il modulo di test dell'unità dovrebbe avere accesso speciale ai moduli dell'app, altrimenti è necessario aggiungere un sacco di bagaglio per il controllo degli accessi.

Dal documentation:

Default Memberwise Initializers for Structure Types

The default memberwise initializer for a structure type is considered private if any of the structure’s stored properties are private. Otherwise, the initializer has an access level of internal.

As with the default initializer above, if you want a public structure type to be initializable with a memberwise initializer when used in another module, you must provide a public memberwise initializer yourself as part of the type’s definition.

+3

Si applica anche a "codice di supporto" aggiunto alla directory Sources in un nuovo parco giochi 6.3. Continuando il tema dei parchi giochi è sempre poco utile. –

+1

Risolto in Swift 2.0, come @ Ben-G indica – MattD

Problemi correlati