如果Swift通用類型約束是協議名稱,那麼我可以要求兩種類型(約束於該協議)的類型相同。例如:如何在Swift通用中說「同一類」
protocol Flier {}
struct Bird : Flier {}
struct Insect: Flier {}
func flockTwoTogether<T:Flier>(f1:T, f2:T) {}
功能flockTwoTogether
可以與鳥和鳥或與昆蟲和昆蟲被調用,但不與鳥和昆蟲。這是我想要的限制。到現在爲止還挺好。
但是,如果我嘗試用一個類名相同的事情,這是行不通的:
class Dog {}
class NoisyDog : Dog {}
class WellBehavedDog: Dog {}
func walkTwoTogether<T:Dog>(d1:T, d2:T) {}
的問題是,我可以叫walkTwoTogether
與WellBehavedDog和NoisyDog。這是我想要防止的。
實際上有兩個問題在這裏:
有沒有辦法說
walkTwoTogether
不能以WellBehavedDog和NoisyDog叫?這是一個錯誤?我問,因爲如果我不能使用泛型來說這個,很難看出爲什麼泛型約束成爲類名稱是有用的,因爲我們可以用普通函數得到相同的結果。
這對我來說好像是預期的行爲?你已經將可選項限制爲Dog類型。您的兩個子類都符合該類型,並且聲明中的任何內容都不會限制它們。如果有辦法做你想做的事情,我會期望它需要一個'where'子句,如'',但是也會拋出一個錯誤。 –
cmyr
2014-12-05 19:40:06
@cmyr是的,當然我嘗試過。這就是爲什麼我問我在做什麼不是如何去做,是否有可能做到這一點。 :) – matt 2014-12-05 19:43:28
這一切都有效,如果'狗'是一個協議。通用約束不能在非協議類型上強制執行。 *(東西類型擦除)* – mattt 2014-12-05 19:44:31