2017-12-29 9 views
-1

두 개의 파일이 있습니다. 그 안에이 클래스가 하나 :다른 파일에서 변수에 액세스

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  
    } 
} 

내가 다른 계산에서 사용하는 average에 액세스하고 싶은 또 다른 하나. 그게 가능하니? 당신은 average을 가질 수

답변

0

RelativeStrength 클래스 내부의 정적 변수가 될.

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  
    } 
} 

그런 다음 다른 클래스에서 직접 그 평균을 참조 할 수 있습니다 :

class OtherClass: NSObject { 
    var randomVar = 0 

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

당신이 당신의 calculateRSI 기능은 다음 방금에 static을 추가 할 수 있습니다뿐만 아니라 다른 클래스에서 사용하려면 함수 이름을 사용하고 같은 방식으로 사용하십시오.

+0

이것은 완벽한 방법 인 것 같습니다! 그러나'randomVar = RelativeStrength.average'에서'Expected declaration'을 얻었습니다. – martin

+0

주의하십시오. RelativeStrength 클래스의 인스턴스를 여러 개 가질 수 있지만이 메서드를 사용하면 모두 동일한 평균 변수를 공유하게됩니다. –

+0

@ Martin33000 불명확하다. 코드는 단지 예일뿐입니다. 메소드/함수에만 코드를 작성해야합니다. 업데이트 된 예제를 확인하십시오. – 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) 
} 

또는 당신이 사용할 수있는 대표

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

내가 상수 '평균'유형을 가지고 추론 '()', 예기치 않은 일 수있는'얻을 : 여기

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

는 놀이터에서 예입니다 '그리고 '이항 연산자'> '는 사용하려고 할 때'() '및'Int '형식의 피연산자에 적용 할 수 없습니다 .. – martin

+0

변수에 액세스하지 않아도 첫 번째 아이디어는 해결책입니다. 델리게이트 사용은이 상황에 필요한 것 이상이며, 델리게이트를 RelativeString 클래스의 인스턴스에 할당해야합니다. 또한 대리자는 값을 액세스하는 데 사용되지 않지만 상황이 발생할 때 알림을받습니다. –

0

대신 계산 된 속성을 사용할 수도 있습니다. 계산 속성과의 유일한 차이점은 이런 종류의 이유 때문에 더 깔끔하게 보입니다.

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 
    } 
} 

: 그리고 enter image description here

+0

Rafael 고맙습니다. 평균을 재사용해야하는 곳에서 놀랍도록 잘 작동하지만 문제는 viewRes()를'calculateRSI()'를'rsi '로 바꿀 때 viewDidLoad에서'calculateRSI()'를 사용했다는 것입니다.''Expression of type 'Double'is unused' – martin

+0

@ Martin33000 calculateRSI()는 현재 viewDidLoad에서 무엇을합니까? 클래스 속성을 설정하거나 값을 반환하지 않기 때문에 함수가 아무 것도하지 않는 것 같습니다. – Rafael

+0

예를 들어 기능을 단순화했습니다. 그러나 여기 내가있는 viewDidLoad에있는 것입니다 :'fetchRsiData() {항목, 가드 오류 항목 = 항목, 오류 == 다른 무기 호 { 인쇄 (오류 ?? "알 수없는 오류") 반환 } 하자하자 otherObject = RelativeStrength() otherObject.items = items otherObject.calculateRSI() } – martin

관련 문제