2014-06-10 2 views
7

Cercare un modo per utilizzare le estensioni Swift in un file separato o in una soluzione alternativa. La creazione di un'estensione funziona solo a condizione che l'estensione sia scritta nello stesso file in uso.Utilizzo di estensioni in un file .swift separato

Ecco un esempio di ViewController.swift che funziona.

import UIKit 
var TestHelper: String = "Start Value" 
extension UIView { 
var testValue:String{ 
set{ 
    TestHelper = newValue 
} 
get{ 
    return TestHelper 
} 
} 
} 

class ViewController: UIViewController { 
override func viewDidLoad() { 
    super.viewDidLoad() 
    self.view.testValue = "Some Value" 
} 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 
} 

Prendendo l'estensione di questo file e l'immissione in una nuova risultati di file in un incidente che dà questo errore:

Program ended with exit code: 9 

Questo errore è dicendo che non esiste credo. La creazione dell'estensione in ogni file separato di cui l'estensione è necessaria crea ovviamente problemi con la redeclaration non valida.

Grazie in anticipo!

+1

Quando provo questo si blocca il compilatore. Potresti voler [archiviare un bug] (http://bugreport.apple.com). – jtbandes

+0

Mi sento molto incerto sulla proprietà all'interno dell'estensione. Non hai la situazione come in http://stackoverflow.com/a/24115223/1726069? –

risposta

2

Se si sposta l'estensione su un altro file, è necessario spostare anche TestHelper. O più semplice: mettere TestHelper nell'estensione

+0

Avrei dovuto chiarire che ho inserito l'estensione helper nel file di estensione. Non sembra avere importanza. Se non mi sbaglio, testHelper inserito nell'estensione richiederebbe l'uso di getter/setter e causerà lo stesso problema risolto posizionandolo all'esterno? – user3724387

1

Ho provato il problema pensando che sarebbe stato facile, ma sembra più complesso di quanto avrei inizialmente pensato.

Ho finito per dover sottoclasse UIView. Non sono riuscito a creare un'estensione per UIView che aggiungesse una var. Penso che forse ci stanno costringendo a sottoclasse UIView, a causa di come funziona init o get/set per la classe. L'ho appena fatto. Non è lo stesso ma ha funzionalità equivalente

import UIKit 

class MyView: UIView { 
    var testValue: String? 
    init(frame: CGRect) { 
     super.init(frame: frame) 
     self.backgroundColor = UIColor.greenColor() 
     self.bringSubviewToFront(self.superview) 
    } 
} 

e poi usato come tale

override func viewDidLoad() { 
    super.viewDidLoad() 

    let myRect = self.myContent.frame 
    let myNewView: MyView = MyView(frame: myRect) 
    myNewView.testValue = "has been set" 
    self.myView.addSubview(myNewView) 

    NSLog("%@", myNewView.testValue!) 

} 

posso estendere Array con una var

extension Array { 
    var last: T? { 
    if self.isEmpty { 
     NSLog("array crash error - please fix") 
     return self [0] 
    } 
    else { 
     return self[self.endIndex - 1] 
     } 
    } 
} 

È facile creare un'estensione per UIKit se si aggiungono solo funzioni e non una variabile

extension UIView { 
    func layerborders() { 
     let layer = self.layer 
     let frame = self.frame 
     let myColor = self.backgroundColor 
     layer.borderColor = UIColor.whiteColor().CGColor 
     layer.borderWidth = 0.8 
     layer.cornerRadius = frame.width/MyConstants.CornerRadius.toRaw() 
    } 
} 
+1

Grazie per aver dedicato del tempo per verificare questo problema. Mi piace la soluzione, ma probabilmente non sarà qualcosa che uso tristemente come soluzione. Ritengo che, usando questo stile per disegnare una barra delle schede o una barra di navigazione, si verifichino problemi di stratificazione e pulsanti di sovrapposizione ecc. – user3724387

1

Ho anche incontrato lo stesso errore e cercando di risolverlo ho trovato che l'aggiunta di statica di fronte alla dichiarazione di variabile estensione sembra fare il trucco:

import UIKit 

static var TestHelper: String = "Start Value" 

extension UIView { 

    static var testValue: String { 
     set { 
      TestHelper = newValue 
     } 
     get{ 
      return TestHelper 
     } 
    } 

} 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.testValue = "Some Value" 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

} 

Speranza che aiuta!