簡體   English   中英

斯威夫特:父類類函數是否可能返回子類的實例?

[英]Swift: Is it possible that parent class class function returns a instance of subclass?

我在下面編寫了Swift代碼。

class Animal {

    class func getAnimalByName(name:String) -> ?? {
        if(name == "Cat") {
            return Cat()
        } else {
            return Bird()
        }
    }

}

class Cat: Animal {
    func run() {
        println("run")
    }
}

class Bird: Animal {
    func fry() {
        println("fry")
    }
}

然后我想像下面的代碼那樣編寫而不使用“ as Cat”強制轉換

var cat = Animal.getAnimalByName(name: "Cat")
cat.run()

什么應該 ?? 在動物課上是?

我嘗試了AnyObject,但是當我在iphone模擬器上構建代碼時,出現了一個錯誤,提示“ methodSignatureForSelector:-提前遇到無法識別的選擇器-[Cat運行]”,盡管此編譯成功。

您應該向下轉換由getAnimalByName方法返回的對象,

class Animal {

    class func getAnimalByName(name:String) -> Animal {
        if(name == "Cat") {
            return Cat()
        } else {
            return Bird()
        }
    }

}

class Cat: Animal {
    func run() {
        println("run")
    }
}

class Bird: Animal {
    func fry() {
        println("fry")
    }
}



var cat = Animal.getAnimalByName("Cat") as Cat
cat.run()

如果不進行向下轉換,您將無法做到這一點,因為如果您希望能夠調用cat.run() ,它將必須從某種類型轉換為特定類型的Cat 如果返回Return Animal ,則可以使用可選的向下轉換或強制向下轉換:

// optional
let cat = Animal.getAnimalByName("Cat")
if let cat = cat as? Cat {
    cat.run()
}

// forced
let cat2 = Animal.getAnimalByName("Cat")
(cat2 as! Cat).run()

也就是說,不要執行第二個,只執行可選的強制轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM