2017-01-24 7 views
1

신속한 답변 클래스/하위 클래스 그룹에서 수퍼 클래스의 변수를 필요한 범위 내에 넣고 싶습니다. 예를 들어, 다음 코드에서. 나는 위의에 대해 좋아하지 않는 무엇Swift에서 클래스 변수 설정 요구 사항

class Vehicle { 
    var speed: Int 
    var heading: Int 

    init(speed: Int, heading: Int) { 
     self.speed = speed 
     self.heading = heading 
    } 

    func turnRight() { 
     if 360 - heading < 90 { 
      heading = heading - 270 
     } else { 
      heading = heading + 90 
     } 
    } 
} 

class Car : Vehicle { 
    init(speed: Int, heading: Int) { 
     super.init(speed: speed, heading: heading) 
    } 

    override func turnRight() { 
     speed = speed/2 
     if 360 - heading < 90 { 
      heading = heading - 270 
     } else { 
      heading = heading + 90 
     } 
    } 
} 

, 나는 차를 더 서브 클래스를 만드는거야, 난 항상 내가 게터에 대해 알고 0 내에서 360 그 제목은 확인하기 위해 강제로 것이라는 점이며, setter를 사용할 수 있지만 setter를 사용하고 여전히 변수를 증가시킬 수있는 방법이 있습니까?

이상적으로, 내 turnRight 기능을 같이 할 :

func turnRight() { 
    heading = heading + 90 
} 

override func turnRight() { 
    speed = speed/2 
    heading = heading + 90 
} 

... 그리고 슈퍼 클래스 내 변수 세트는 제목이 있는지 확인하기 위해

+0

음에 didSet 사용을 고려, 당신은 당신의 모든 시간을 베어링 확인하는 대신이 함수를 호출 매개 변수로 플로트와 changeHeadingBy라는 함수를 만들 수 있습니다. 그런 다음 두 번째 예에서 "추가"대신에 이것을 사용하십시오. – SaylorTwift2

+0

'super.turnRight()'를 호출하면 어떨까요? – Sulthan

답변

1

대해 0 내부와 360 머리글 논리를 별도의 구조로 이동 하시겠습니까?

데모 코드는 위에 나와 있습니다.

struct Heading { 

    private var heading = 0 
    init(initialHeading: Int) { 
     heading = initialHeading 
    } 
    mutating func turnRight(){ 
     if 360 - heading < 90 { 
      heading = heading - 270 
     } else { 
      heading = heading + 90 
     } 
    } 
} 

class Vehicle { 
    var speed: Int 
    var heading: Heading 

    init(speed: Int, heading: Int) { 
     self.speed = speed 
     self.heading = Heading(initialHeading: heading) 
    } 

    func turnRight() { 
     heading.turnRight() 
    } 
} 

class Car : Vehicle { 
    override init(speed: Int, heading: Int) { 
     super.init(speed: speed, heading: heading) 
    } 

    override func turnRight() { 
     speed = speed/2 
     super.turnRight() 
    } 
} 

편집 : 대신 간단하게 호출 할 수있는 구현을 반복하는, Vehicle의 구현은 간단 할 수 있지만

typealias Angle = Int 

enum Direction: Angle { 
    case left = -90 
    case right = 90 } 

struct Heading { 

    private var heading : Angle 
    init(initialHeading: Angle) { 
     heading = initialHeading 
    } 

    mutating func turnBy(angle: Angle){ 
     if 360 - heading < angle { 
      heading = heading - (360 - angle) 
     } else { 
      heading = heading + angle 
     } 
    } 
} 

class Vehicle { 
    var speed: Int 
    var heading: Heading 

    init(speed: Int, heading: Int) { 
     self.speed = speed 
     self.heading = Heading(initialHeading: heading) 
    } 

    func turnRight() { 
     heading.turnBy(angle: Direction.right.rawValue) 
    } 
} 

class Car : Vehicle { 
    override init(speed: Int, heading: Int) { 
     super.init(speed: speed, heading: heading) 
    } 

    override func turnRight() { 
     super.turnRight() 
     speed = speed/2 
    } 
} 
+1

'turnRight'를'turn (angle :)'으로 바꾸 겠지만 구조체를 사용하는 것은 아주 좋은 아이디어입니다. – Sulthan

+0

@ 설탕 주셔서 감사합니다. 이 함수와 enup 및 typealias를 사용하여 새 코드를 원래 응답으로 업데이트했습니다. –

+0

매우 유용합니다. 아직 구조체를 사용하지 않았지만 (Swift의 큰 부분이므로 C++의 작은 부분을 알고 있습니다. 친숙 함). 하지만, 그것은 꽤 자체 설명 데이터 구조처럼 보이고 내 유스 케이스에 훌륭하게 작동합니다. 감사! –

1

값 typealias와 각도에 의한 일반적인 기능을 켜고 열거 새로운 솔루션을 업데이트 원래 구현 :

override func turnRight() { 
    speed = speed/2 
    super.turnRight() 
} 

더 간단한 구현을 위해, 우리는 n 예 :

var heading: Int { 
    didSet { 
     if heading < 0 { 
      heading = heading % 360 + 360 
     } else { 
      heading = heading % 360 
     } 
    } 
} 

self.heading += 90을 사용하면 터닝을 수행 할 수 있습니다.

+0

감사합니다 @ 설화! –

1

하는 heading

class Vehicle { 
    var speed: Int 
    var heading: Int { 
     didSet { 
      if heading > 360 { 
       heading -= 360 
      } else if heading < 0{ 
       heading += 360 
      } 
     } 
    } 

    init(speed: Int, heading: Int) { 
     self.speed = speed 
     self.heading = heading 
    } 

    func turnRight() { 
     heading += 90 
    } 
} 

class Car : Vehicle { 
    init(speed: Int, heading: Int) { 
     super.init(speed: speed, heading: heading) 
    } 

    override func turnRight() { 
     speed = speed/2 
     super.turnRight() 
    } 
} 
+0

단지 '부두'를 '720'으로 설정하면 부적절한 점으로, '0..360' 간격으로 유지되지 않습니다. – Sulthan

+0

_ "서둘러 대답하고 여가를 회개하십시오!"_ –

+0

감사합니다! 나는 didSet을 보았지만, 어떤 이유로이 경우에는 작동하지 않을 것이라고 생각했다. 그것을보고 다행 :) –