11

以下のObjective CカテゴリをSwiftに書き直しています:

@implementation UIImage (Extra)

+ (UIImage *)validImageNamed:(NSString *)name
{
    UIImage *image = [self imageNamed:name];
    NSAssert(image, @"Unable to find image named '%@'", name);
    return image;
}

これは便利な init として実装するように求められますが、指定された初期化子 self.init(named:) が成功するかどうかを確認するにはどうすればよいですか?

extension UIImage {
    convenience init(validateAndLoad name: String!) {
        self.init(named: name)

        // need to assert here if self.init fails
    }

self.init(named:) 呼び出しが失敗すると、拡張機能の init の実行が停止します。

UIImage インスタンスを作成してそれを自分自身に割り当てようとしましたが、これはコンパイルされません。

もちろん、ObjC バージョンのようにヘルパー メソッドを使用できます。

extension UIImage {

    class func validImage(named name: String) -> UIImage {
        var image = UIImage(named: name)
        assert(image == nil, "Image doesn't exist")
        return image
    }

しかし、イニシャライザを使用してこれを実装する方法はありますか?

4

3 に答える 3

3

Objective-C とは異なり、Swift イニシャライザは self を返さないため、初期化の失敗をチェックすることはできません。Apple のエンジニアは、代わりにオプションの戻り値の型を持つファクトリ メソッドを使用することを提案しました。

class ImageFactory {

    class func validImage(named name: String) -> UIImage? 
    {
        var image = UIImage(named:name)
        assert(image != nil, "fail")
        return image;
    }
}

Apple のエンジニアは、ファクトリ クラス メソッドを使用して回避する言語に何かを組み込む作業を行っていることを示しました。

于 2014-06-13T17:19:47.243 に答える
0

私は以下のような方法を書きます:

extension UIImage {

class func validImage(named name: String) -> UIImage? {
    var image = UIImage(named: name)
    return image
}

迅速にオプションを使用できます。指定された名前の画像がここにない場合、メソッドは nil を返します。

于 2014-06-13T16:28:46.107 に答える