5

我正在尝试做这样的事情:

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

        //...

        let image = UIGraphicsGetImageFromCurrentContext()
        UIGraphicsEndImageContext()

        return image // <- impossible
    }
}

但这是不可能的,因为“nil”是初始化程序的唯一有效返回......我该怎么做?

例如,Objtive-C 方法 [UIImage imageNamed:] 是一个类方法(它可以在 Objective-C 中返回它想要的任何内容),它被映射到 swift 初始化程序 UIImage(named:)。

4

2 回答 2

6

您想要的是类工厂方法,而不是初始化程序。Foundation/Cocoa 中的大多数工厂方法都会自动桥接到初始值设定项,但是如果您无法通过 完成您想要的操作init,您可以添加一个新的类方法:

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

        //...

        let image = UIGraphicsGetImageFromCurrentContext()
        UIGraphicsEndImageContext()

        return image
    }
}
于 2015-10-19T18:08:38.737 回答
1

这是因为您正在返回一个新对象,而不是 self。init 的重点是创建对象的结构,而不是一个新的,所以如果你想把它作为一个方便的 init 来做,你需要这样做:

public extension UIImage {
    public convenience init?(whatever: Int) {
        defer {
            UIGraphicsEndImageContext()
        }
        UIGraphicsBeginImageContextWithOptions(...)

        //...
        guard let currentContext = UIGraphicsGetCurrentContext() else { return nil }
        guard let image = currentContext.makeImage() else { return nil }

        self.init(cgImage:image)
    }
}

也许您想要创建一个正在执行您要求的类函数,而不是方便的 init:

public class func createImage(whatever: Int) -> UIImage? {
    defer {
        UIGraphicsEndImageContext()
    }
    UIGraphicsBeginImageContextWithOptions(...)

    //...
    guard let currentContext = UIGraphicsGetCurrentContext() else { return nil }
    guard let cgImage = currentContext.makeImage() else { return nil }
    let image = UIImage(cgImage: cgImage)

    return image
}

我很抱歉这不是 100% 的代码,但这基本上是它的要点

于 2015-10-19T18:16:44.713 回答