2017-06-05 110 views
-1

在這裏嘗試是我的設置:斯威夫特協議繼承和動態對象混亂

protocol CommonFeatureProtocol { } 
extension CommonFeatureProtocol { } 


protocol SpecificFeature1Protocol : CommonFeatureProtocol { 
    func specificFeature1Method() 
    } 


protocol SpecificFeature2Protocol : CommonFeatureProtocol { 
     func specificFeature2Method() 
} 

struct specificFeature1 : SpecificFeature1Protocol { } 
struct specificFeature2 : SpecificFeature2Protocol { } 
我在其他類( UtilFeature)的一個

現在,將有可能使用功能對象和特定功能的方法,如 -

UtilFeature.feature.specificFeature1Method() 
UtilFeature.feature.specificFeature2Method() 

喜歡的東西(在UtilFeature) -

var feature : CommonFeatureProtocol { 
    return specificFeature1() //or specificFeature2() 
} 
+1

什麼是不工作的。你期望什麼? – Mundi

+2

請注意,像'protocol'&'struct'這樣的關鍵字必須是小寫字母(您的代碼不會被編譯)。類型名稱也應該是'UpperCamelCase',例如'SpecificFeature1Protocol'。否則'specificFeature1()'看起來像一個函數調用。 – Hamish

+0

@Mundi:UtilFeature.feature.specificFeature1Method()將不起作用commonFeatureProtocol不具有specificFeature1Method() – BaSha

回答

0

希望我已經正確理解你的問題

是的,可以考慮下面的簡單例子。

protocol P0 {} 
protocol P1 : P0 {} 
protocol P2 : P0 {} 

class C1 : P1 {} 

let p : P0 = C1() //Expects p to be of the type P0 
2

你試圖實現似乎不可能,因爲該功能是CommonFeatureProtocol類型,它不包括該方法。所以用對象(點)方法訪問是不可能的。

可能的:

var feature : SpecificFeature1Protocol { 
    return specificFeature1() 
} 

feature.specificFeature1Method() 

或者(不推薦這樣做的方式)

var newFeature : CommonFeatureProtocol { 
    return specificFeature1() 
} 

(newFeature as SpecificFeature1Protocol).specificFeature1Method() 

得到了你想要做什麼的點,

你需要做兩個協議的組成。

語法var composition: [Protocol1 & Protocol2]

此外,您還可以使用typealias,使其更具可讀性。

所以,你的情況:

typealias SpecificFeatureProtocol = SpecificFeature1Protocol & SpecificFeature2Protocol 

var feature: SpecificFeatureProtocol? { 
    return nil 
} 

現在,你可以使用的方法類似下面:

feature?.specificFeature1Method() 
feature?.specificFeature2Method()