2016-07-16 29 views
0

在我的兩個班,我有以下的代碼如何創建可用於2個不同類的通用swift函數?

// Two classes who's code I am trying to reduce using protocols 
class class1 { 
    var view: viewSubclass1! 
    func printName() { 
     print("This is the view: \(view)") 
    } 
} 

class class2 { 
    var view: viewSubclass2! 
    func printName() { 
     print("This is the view: \(view)") 
    } 
} 

// The protocol and protocol extension I am trying to create 
protocol myProtocol { 
    var view: UIView {get set} 
    func printName() 
} 

extension myProtocol { 
    func printName() { 
     print("This is the view: \(view)") 
    } 
} 

// The subviews of UIView 
class viewSubclass1: UIView {} 
class viewSubclass2: UIView {} 

正如你所看到的,class1class2屬於不同類別,但具有相同的變量名:view和相同的函數名。區別在於view變量的類型不同。

問題:使用協議和協議擴展,如何減少兩個類之間的代碼?我不想重複代碼,因爲它們非常相似。我一直在嘗試不同的代碼版本,但我一直陷入困境。我不太明白。 我怎樣才能讓這兩個類使用相同的代碼使用協議和協議擴展?

回答

1

(更新)

隨着宣佈的協議和協議擴展:

protocol MyProtocol { 
    associatedtype BaseView: UIView 
    var view: BaseView! {get set} 
    func printName() 
} 

extension MyProtocol { 
    func printName() { 
     print("This is the view: \(view)") 
    } 
} 

並給出了兩個UIView的子類:

class ViewSubclass1: UIView {} 
class ViewSubclass2: UIView {} 

(大寫的某種類型的可讀性名)

並宣佈兩個類是這樣的:

class Class1: MyProtocol { 
    var view: ViewSubclass1! 
} 

class Class2: MyProtocol { 
    var view: ViewSubclass2! 
} 

你會發現,你可以用你的printName()兩個Class1Class2

有一兩件事很重要的位置:

如果你宣佈你view在協議作爲var view: UIView {get set}var view: ViewSubclass1!不能履行該協議的要求。 (有一件事是可選性的差異,另一個原因是,你不能分配的UIViewUIView的子類的任何實例view: ViewSubclass1。)

但很多事情都取決於你真的想在你的常用代碼來完成。

+0

我編輯了我的問題。第一個是一團糟。我試圖讓它變得更簡單。 –

+0

@JTAppleCalendarforiOSSwift,好的,稍後我會更新我的答案。 – OOPer

相關問題