似乎有幾種情況下Swift類函數上的required
關鍵字會非常有用,特別是由於類函數返回Self
的能力。爲什麼`required`不是Swift中類函數的有效關鍵字?
當從class func
返回Self
,也有不幸的是兩個限制,使執行所述功能非常困難/抑制作用:
不能使用
Self
作爲函數裏面執行類型檢查,即:class Donut { class func gimmeOne() -> Self { // Compiler error, 'Self' is only available in a protocol or as the result of a class method return Donut() as Self } }
您不能返回的實際類型的類本身,即:
class Donut { class func gimmeOne() -> Self { // Compiler error, 'Donut' is not convertible to 'Self' return Donut() } }
原因對於這些編譯器錯誤是有效的。如果您有一個GlazedDonut
子類不會覆蓋此類功能,則有可能撥打GlazedDonut.gimmeOne()
將返回Donut
,其中不是 a Self
。
看來這種情況可以通過允許類用required
指定這些函數來緩解。這將確保任何子類都會覆蓋該方法並引發他們自己的一輪類型檢查,確保GlazedDonut
在任何情況下都會自行返回,從而消除了Donut
回來的可能性。
有沒有技術,權威爲什麼這還沒有被添加?我想建議它作爲對Swift團隊的改進,但要確保它沒有明顯的原因,爲什麼它被省略或無法完成。
的理念,爲這個問題來源於此:
https://stackoverflow.com/a/25924224/88111
這是完美的。使用'self()'作爲構造函數效果很好。此外,這還允許子類重寫類函數,同時調用它們自己新添加的「必需」初始值設定項。這意味着''GlazedDonut''可以調用'self()',或者它可以調用'self(glazeAmout:「這麼多,太多了?」)'並且爲'GlazedDonut'和所有的子類創建初始值'required' *那*特別的甜甜圈類型。謝謝 - 這個問題一直困擾着我好幾天。 – 2014-09-20 13:32:47