2015-09-27 34 views
0

我正在爲我自己的小框架編寫一個小型的控制容器反轉(主要是我可以學到更多),而且我偶然發現了一個問題 - 好吧,這只是最新的幾個問題。在協議定義中,一個Swift typealias可以被約束到另一個嗎?如果不是,我還能如何實現類似組件註冊的功能?

我曾希望swift足夠靈活,可以在C#中移植Castle.Core的核心模式。我的第一個失望的是蘋果,害得我做這個醜陋提供的弱反射能力...

public protocol ISupportInjection { 

} 

public protocol IConstructorArguments { 

    func toArgumentsDictionary() -> [String:AnyObject?] 

} 

public protocol ISupportConstructorInjection: ISupportInjection { 

    init(parameters:IConstructorArguments) 

} 

...的想法是,有一天(不久)我可以對付它,並刪除任何引用到我的服務/組件中的這些約束。

現在我想寫IIocRegistration兩個typealias:一個用於TService,另一個爲TComponent,理想在那裏TService是和TComponent是一個具體structclass實現TService

public protocol IIocRegistration { 

    typealias TService: Any 
    typealias TComponent: TService, ISupportConstructorInjection 

} 

但看來TComponent: TService根據編譯器完全無效,它說:

從非協議,無級式「`Self`.TService」

繼承

所以我想知道如何使一個typealias派生另一個typealias如果可能的。

+1

請不要端口C#的東西(好像是這個我或T字頭)到斯威夫特的地方不會爲任何Swift開發人員提供任何意義(除非他們真的是正在編寫Swift的C#開發人員),並且會無休止地成爲這個問題的一個要點。「爲什麼這裏有T? 「我在做什麼?」我們不會在Cocoa/CocoaTouch中縮寫。 – nhgrif

回答

1

首先,typealias在swift協議中做的不是定義一個類型別名。使用swift協議內的關鍵字typealias來定義associated type,您可以在其中查看swift編程手冊。

回到你的情況可能的解決方案,我能想出是移動typealias外協議像這樣

public typealias TService = Any 

public struct component: TService, ISupportConstructorInjection { 
    public init(parameters: IConstructorArguments) { 
     // 
    } 
} 

public typealias TComponent = component 

public protocol IIocRegistration { 
    var service: TService {get set} 
    var component: TComponent {get set} 
} 
+0

對不起,遲到的接受,你的回答很好,但我希望它不是最好的可用:) –

相關問題