5

私はこのようなことをしようとしています:

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

        //...

        let image = UIGraphicsGetImageFromCurrentContext()
        UIGraphicsEndImageContext()

        return image // <- impossible
    }
}

しかし、「nil」が初期化子の唯一の有効な戻り値であるため、これは不可能です...どうすればよいですか?

たとえば、Objtive-C メソッド [UIImage imageNamed:] はクラス メソッド (Objective-C で必要なものを何でも返すことができる) であり、迅速な初期化子 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

これは、自己ではなく新しいオブジェクトを返すためです。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 に答える