초기 Swift에서 Cocos2D 초기화 코드 재구성

판다 돼지·후페가 창작하거나 번역한 작품.전재를 환영합니다. 전재는 출처를 밝혀 주십시오.잘 못 썼다고 생각되면 의견을 많이 내주시고 괜찮다고 생각되면 좋아요를 많이 눌러주세요.감사합니다!hopy ;)
우리는 초기의 Swift에서 하위 클래스에서 슈퍼클래스 디자인 초기화기만 호출할 수 있다는 것을 알고 있다. 이것은 Swift 초기 버전의 제한이기 때문에 예를 들어 CCSprite 하위 클래스의 init 작업을 완성하려면 코드를 많이 써야 한다.
init(type:FallingObjectType){
        self.type = type
        var imageName:String? = nil
        if type == .Good{
            let rndIndex = randomInteger(FallingObject.imageNames.good.count)
            imageName = prefixAssetsPath(FallingObject.imageNames.good[rndIndex])
        }else if type == .Bad{
            let rndIndex = randomInteger(FallingObject.imageNames.bad.count)
            imageName = prefixAssetsPath(FallingObject.imageNames.bad[rndIndex])
        }

        let spriteFrame = CCSpriteFrame(imageNamed: imageName)
        super.init(texture: spriteFrame.texture, rect: spriteFrame.rect, rotated: false)
        anchorPoint = ccp(0, 0)
    }

CCSprite에는 이미지 Named: 이미지 Name 초기화 방법이 있지만 이 초기화기는 convenience initializers입니다. So는 알다시피 하위 클래스는 초클래스의 비convenience 초기화기만 호출할 수 있기 때문에 CCSprite Frame을 만들고 슈퍼의 init(texture: sprite Frame.texture,rect: sprite Frame.rect,rotated:false) 초기화기를 호출해야 합니다!
하지만 최신 Xcode 7 에서는3에서 2.2 버전의 Swift는 더 이상 이렇게 할 필요가 없습니다. 우리는 바로 이렇게 쓸 수 있습니다.
init(type:FallingObjectType){
        self.type = type
        var imageName:String? = nil
        if type == .Good{
            let rndIndex = randomInteger(FallingObject.imageNames.good.count)
            imageName = prefixAssetsPath(FallingObject.imageNames.good[rndIndex])
        }else if type == .Bad{
            let rndIndex = randomInteger(FallingObject.imageNames.bad.count)
            imageName = prefixAssetsPath(FallingObject.imageNames.bad[rndIndex])

        super.init(imageNamed: imageName)
        anchorPoint = ccp(0, 0)
    }

직접 슈퍼.init(imageNamed: imageName) 완료!
하지만 아쉬운 건 스위프트 2.2에서는 Type의class 속성 키워드를 지원하지 않습니다. static만 사용할 수 있습니다. Swift3의 개선을 기대합니다!

좋은 웹페이지 즐겨찾기