2016-03-28 40 views
1

您好我想問一下,在編譯時,是否有任何方法在xCode上出現錯誤,當您使用需要首先調用另一個方法的類方法時?以前沒有調用方法的Swift錯誤

我解釋一下:

class MyClass { 
    func initializeClass(){ 
    } 
    func loadConfig() { 

    } 
} 

var myClass = MyClass() 

myClass.loadConfig() - 而編碼,同樣爲你當你沒有實現所需的協議功能>投擲錯誤

正確方法:

myClass.initializeClass().loadConfig() 

回答

3

解決這種情況的一種方法是使用Proxy Design Pattern。而不是增加這兩種方法MyClass,使loadConfig()MyClassInitProxy實例方法:

public class MyClass { 
    public class MyClassInitProxy { 
     let owner:MyClass 
     public func loadConfig() { 
      // Do the config work using owner to access MyClass 
     } 
     private init(owner:MyClass) { 
      self.owner = owner 
     } 
    } 
    public func initializeClass() -> MyClassInitProxy { 
     // Do preparation, then 
     return MyClassInitProxy(owner:self) 
    } 
} 

現在人們可以撥打loadConfig的唯一途徑是通過initializeClass()呼梯取得MyClassInitProxy

var myClass = MyClass() 
myClass.initializeClass().loadConfig() 
+0

呵呵,你總是可以初始化MyClassInitProxy並在其上調用loadConfig。因爲您稍後修改它,您也不能在第3行擁有所有者。這不是代理設計模式的正確用法:( – Lachezar

+0

使用'private'關鍵字可以防止「始終只是初始化'MyClassInitProxy'並調用'loadConfig'」。另外,我完全可以讓owner作爲常量在線3因爲'init'被允許(實際上,它是必需的)分配所有常量成員 – dasblinkenlight

+0

「不可變的值self.owner只能初始化一次」 - 得到這個錯誤:D – Lachezar

0

簡短的回答是 - 不,使用這種方法你不會有編譯時錯誤。

但是,如果您希望任何人都無法在沒有配置準備的情況下實例化您的類,那麼只需要在初始化程序中將該配置作爲參數。例如。

class MyClass { 
    init(config: YourConfigType) { 
     // do something with the config parameter 
    } 
} 
... read config from somewhere and create config variable ... 
let x = MyClass(config: config) 

然後你有一個「編譯時錯誤」每當有人想使用你的類不用最初有配置設置。