爲了簡單起見,結構鴨打字,我要簡化最終目標與斯威夫特
我試圖寫斯威夫特100%的通用PostProvider協議。 但是,由於「發佈」可能包含不同平臺上的不同信息,因此該協議必須是「一般類型」。以一個結構作爲其參數,它定義了任何基礎職位的結構。
struct Post {
// Only fields required by ALL posts
var id: UInt64
var title: String
var content: String
}
struct WPPost : Post {
// WordPress posts also have an author
var author: UInt64
}
struct DrupalPost : Post {
// Drupal posts also have an author
var author: UInt64
// and a 'last updated' timestamp
var lastUpdated: UInt64
}
protocol PostProvider<TPost : Post> {
func getPosts() -> TPost[]
// [...]
}
class WPPostProvider : PostProvider<WPPost> {
func getPosts() -> WPPost {
// [...]
}
}
class DrupalPostProvider : PostProvider<DrupalPost> {
func getPosts() -> DrupalPost {
// [...]
}
}
這些PostProviders將被其他代碼段使用。
爲了讓使用任何PostProvider的代碼儘可能重用,我希望任何需要PostProvider的方法都能夠輸入提示對象中必須包含哪些字段。
這樣,有點..
func myFunction(provider: PostProvider</*any struct that extends the 'Post'
struct and contains an 'author'
field of type 'UInt64'*/>)
我還要做同樣的事情只是一個Post對象
func myFunction(post: /*any struct that extends the 'Post' struct and
contains an 'author' field of
type 'UInt64'*/)
有人向我指出的@Alexander有在swift中沒有'結構繼承'。讓我補充一點,這不是重點。無論如何,這幾乎都是僞代碼。重點是我需要一些'typehinting'方法,只允許我'提示'所需的字段,對於某些數據結構
如果您需要「擴展」您的文章並保留其類型信息,您應該使用類而不是結構。在Swift中沒有「struct擴展struct」這樣的事情。 –
我在問題的底部添加了一條註釋。不過謝謝,我一直認爲swift對結構有繼承性。 – sigsve