2014-10-15 12 views
5

metodi di estensione array sono disponibili da altri moduli (per esempio il progetto XCTest)Array estensione chiamata da altri moduli

Per semplicità il codice qui sotto non fa altro che può essere utilizzato per riprodurre l'errore

import Foundation 

extension Array { 
    mutating func myMethod(toIndex: Int) -> Int! { 
     // no real code, it's here only to show the problem 
     return 0 
    } 
} 

Chiamarlo dalle stesse opere modulo come previsto, ma da una classe test non

class MyProjectTests: XCTestCase { 
    func testMoveObjectsFromIndexes1() { 
     var arr = ["000", "001", "002", "003"] 
     arr.myMethod(0) 
    } 
} 

Penso che questo è corretto perché la visibilità metodo è restricte d al proprio modulo, infatti ottengo l'errore '[String]' does not have a member named 'myMethod'

Ho cercato di definire il metodo estesa come public come mostrato di seguito

extension Array { 
    public mutating func myMethod(toIndex: Int) -> Int! { 
     // no real code, it's here only to show the problem 
     return 0 
    } 
} 

Ma ottengo l'errore di compilazione 'Extension of generic type 'Array<T>' from a different module cannot provide public declarations'

Fino Beta 7 utilizzando public risolto il problema, ma in XCode 6.1 (6A1046a) ottengo questo errore

Come posso risolvere il problema per l'esecuzione in altri moduli/progetti?

+0

Perché estendere Matrice quando è possibile dichiarare una funzione pubblica di primo livello? – mattt

+3

Non è possibile risolvere questo problema. Swift 1.1 ha disabilitato le estensioni pubbliche di tipi generici al di fuori del proprio modulo esplicitamente perché l'implementazione non era la migliore quando lo permettevano. Radar per il suo ritorno. – CodaFi

+0

@mattt questo è solo un esempio per riprodurre il problema, il codice vero e utilizza elementi di matrice quindi è perfetto come estensione – dafi

risposta

3

Swift non consente le estensioni pubbliche attualmente in modo sarà necessario includere tale estensione rapida nel progetto e metterlo parte del target.

1

Anche se non del tutto risolvere la questione originale, ho trovato che avrei potuto metodi di estensione di prova a Swift 2.0 (Under XCode 7.0) importando il modulo con la direttiva @testable:

@testable import MyGreatModule

+1

Totalmente perdere questa nuova funzionalità in Swift 2 ... grazie! Questo ha risolto molti problemi di test dei compagni Swift-ers :) – mdstroebel

Problemi correlati