2017-12-29 21 views
-1

Ich habe zwei Dateien. Eine, die diese Klasse in der es hat:Zugriff auf eine Variable aus einer anderen Datei

class RelativeStrength: NSObject { 

    func calculateRSI() { 
     let relativeStrength1 = 87652 
     let relativeStrength2 = 5634 

     let rSI1 = 100 - (100/(relativeStrength1 + 456)) 
     let rSI2 = 100 - (100/(relativeStrength2 + 12)) 

     let average = (rSI1 + rSI2)/2  
    } 
} 

Und eine andere, wo Ich mag würde average zugreifen es in anderen Berechnungen zu verwenden. Ist das möglich?

Antwort

0

Sie haben könnte eine statische Variable in Ihrem RelativeStrength Klasse sein.

class RelativeStrength: NSObject { 
    static var average: Double = 0 

    func calculateRSI() { 
     let relativeStrength1 = 87652 
     let relativeStrength2 = 5634 

     let rSI1 = 100 - (100/(relativeStrength1 + 456)) 
     let rSI2 = 100 - (100/(relativeStrength2 + 12)) 

     average = (rSI1 + rSI2)/2  
    } 
} 

Dann in der anderen Klasse, können Sie die durchschnittliche Referenz direkt:

class OtherClass: NSObject { 
    var randomVar = 0 

    func setRandomVar() { 
     randomVar = RelativeStrength.average 
    } 
} 

Wenn Sie Ihre calculateRSI Funktion als auch in der anderen Klasse verwendet werden soll, dann können Sie einfach hinzufügen static zu der Name der Funktion, und verwenden Sie es auf die gleiche Weise.

+0

Dies scheint die perfekte Methode zu sein! Aber ich bekomme 'Erwartete Deklaration' bei' randomVar = RelativeStrength.average' – martin

+0

Vorsicht. Wenn Sie diese Methode verwenden, obwohl Sie mehrere Instanzen der RelativeStrength-Klasse haben können, teilen sie alle die gleiche durchschnittliche Variable. –

+0

@ Martin33000 Entschuldigung wegen Unklarheit. Der Code war nur ein Beispiel. Sie müssen Code natürlich nur in Methoden/Funktionen schreiben. Überprüfen Sie mein aktualisiertes Beispiel. – Xcoder

-1
class RelativeStrength: NSObject { 

    func calculateRSI() -> CGFloat { 
     let relativeStrength1 = 87652 
     let relativeStrength2 = 5634 

     let rSI1 = 100 - (100/(relativeStrength1 + 456)) 
     let rSI2 = 100 - (100/(relativeStrength2 + 12)) 

     let average = (rSI1 + rSI2)/2 

     return average 
    } 
} 


class OtherClass: NSObject { 

    let average = RelativeStrength().calculateRSI() 
    print(average) 
} 

Oder Sie können die Delegierten average verwenden

protocol InformingDelegate { 
    func averageChanged(average: CGFloat) 
} 

class RelativeStrength: NSObject { 

func calculateRSI() { 

    var delegate = InformingDelegate? 

    let relativeStrength1 = 87652 
    let relativeStrength2 = 5634 

    let rSI1 = 100 - (100/(relativeStrength1 + 456)) 
    let rSI2 = 100 - (100/(relativeStrength2 + 12)) 

    let average = (rSI1 + rSI2)/2 

    delegate?.averageChanged(average: average) 

} 

class OtherClass: NSObject, InformingDelegate { 

    func averageChanged(average: CGFloat) { 
     print(average) 
    } 
} 

}

+0

ich 'Constant 'durchschnittlichen' gefolgert Typ haben '()', die unerwartet sein kann 'und dann' Binary operator '>' kann nicht auf Operanden vom Typ '()' und 'Int'' angewendet werden, wenn ich versuche, es zu verwenden. – martin

+0

Die erste Idee ist eine Lösung, obwohl Sie immer noch nicht auf eine Variable zugreifen. Die Verwendung von Delegaten ist für diese Situation mehr als erforderlich, und Sie müssen Ihren Delegaten einer Instanz der RelativeString-Klasse zuweisen. Auch ein Delegat wird nicht für den Zugriff auf den Wert als solchen verwendet, sondern wird informiert, wenn etwas passiert. –

0

Sie könnten stattdessen auch eine berechnete Eigenschaft verwenden. Der einzige Unterschied zu Recheneigenschaften ist, dass sie aus diesen Gründen besser aussehen.

class RelativeStrength: NSObject { 
    var rsi: Int { 
     let relativeStrength1 = 87652 
     let relativeStrength2 = 5634 

     let rSI1 = 100 - (100/(relativeStrength1 + 456)) 
     let rSI2 = 100 - (100/(relativeStrength2 + 12)) 

     return (rSI1 + rSI2)/2 
    } 
} 

Und dann:

let average = RelativeStrength().rsi 
print(average) 

Hier ist ein Beispiel auf einem Spielplatz: enter image description here

+0

Danke Rafael es funktioniert erstaunlich gut, wo ich durchschnittlich wiederverwenden muss, aber das Problem ist, dass ich 'calculateRSI()' in einem ViewDidLoad, wenn ich '' calculateRSI() '' mit 'rsi' erhalte ich Ausdruck des Typs 'Double' ist unbenutzt ' – martin

+0

@ Martin33000 Was macht calculateRSI() zur Zeit in der viewDidLoad? Wie ich sehe, scheint Ihre Funktion nichts zu tun, weil sie weder ein Klassenattribut setzt noch den Wert zurückgibt. – Rafael

+0

Ich habe die Funktion für das Beispiel vereinfacht. Aber hier ist das, was ich in meinem viewDidLoad haben: 'fetchRsiData() {Artikel, Fehler in Wache lassen items = Artikel, Fehler == null else { print (Fehler ?? "Unbekannter Fehler") return } let otherObject = RelativeStrength() otherObject.items = Elemente otherObject.calculateRSI() } ' – martin

Verwandte Themen