3

我試圖做這樣的事情:如何在swift方便初始值設定項中返回自定義對象?

public extension UIImage { 
    public convenience init(whatever: Int) { 
     UIGraphicsBeginImageContextWithOptions(...) 

     //... 

     let image = UIGraphicsGetImageFromCurrentContext() 
     UIGraphicsEndImageContext() 

     return image // <- impossible 
    } 
} 

但是,這是不可能的,因爲「無」是一個初始化的唯一有效的回報......我該怎麼辦呢?例如,Objtive-C方法[UIImage imageNamed:]是一個類方法(它可以在Objective-C中返回任何它想要的),並將其映射到swift初始化程序UIImage(named :)。

回答

4

你想要的是類工廠方法,而不是初始化方法。在基礎/可可大多數工廠方法將自動橋接初始化,但如果你想要的東西無法通過init做,你可以添加一個新的類方法:因爲你是返回一個新的對象

public extension UIImage { 
    class func imageWithWhatever(whatever: Int) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(...) 

     //... 

     let image = UIGraphicsGetImageFromCurrentContext() 
     UIGraphicsEndImageContext() 

     return image 
    } 
} 
+0

這是一個有點傷心你不能在Swift中返回一個不同的對象。我有這個框架,在故事板中定義了這個複雜的視圖控制器。我想能夠覆蓋'init()'甚至創建一個自定義的初始化程序來以編程方式實例化視圖控制器,並使用它的子視圖/插口等來設置它。但唯一的方法是使用工廠方法.. 。 –

1

這是,而不是自我。初始化的關鍵是要建立你的對象,而不是一個新的結構,所以如果你想這樣做是爲了方便初始化,你需要做的是這樣的:

public extension UIImage { 
    public convenience init(whatever: Int) { 
     UIGraphicsBeginImageContextWithOptions(...) 

     //... 

     let image = CGBitmapContextCreateImage(UIGraphicsGetCurrentContext()); 
     UIGraphicsEndImageContext() 

     self.init(CGImage:image) 
    } 
} 

也許不是一個方便的初始化,你要創建一個做你所問的一類功能:

public class func createImage(whatever: Int) { 
    UIGraphicsBeginImageContextWithOptions(...) 

//... 

let image = UIGraphicsGetImageFromCurrentContext() 
UIGraphicsEndImageContext() 

return image 
} 

我很抱歉,這不是100%的代碼,但是這基本上是它的要點

相關問題