2

序文:私は主に obj-c && swift n00b です。この 1 年間、RubyMotion を使っていたので、iOS と Cocoa のフレームワークにある程度慣れてきました。だから、私が見逃している邪悪な愚かな、または明白な何かがあるとすれば、それが理由でしょう...

新しい iOS プロジェクト (CoreData を使用) で Mantle の JSONTransformer を使用すると問題が発生します。Swift で次の [obj-c コード] を実装しようとしています。

+ (NSValueTransformer *)updatedAtJSONTransformer {
    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *str) {
        return [self.dateFormatter dateFromString:str];
    } reverseBlock:^(NSDate *date) {
        return [self.dateFormatter stringFromDate:date];
    }];
}

次のdateFormatter関数を定義しました。

func dateFormatter() -> NSDateFormatter {
    let _dateFormatter = NSDateFormatter()
    _dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    _dateFormatter.dateFormat = "yyyy-MM-dd'T' HH:mm:ss'Z'"
    return _dateFormatter
}

以下の実装を使用すると、次のようなエラーが一貫して表示されます。

'AnyObject!' is not a subtype of 'NSString'

また

Cannot convert the expression's type 'MTLValueTransformer!' to type 'NSString?'

私は次のことを試しました:

func createdAtJSONTransformer() -> NSValueTransformer {
    let _forwardBlock: (String) -> NSDate = { str in
        return self.dateFormatter().dateFromString(str)
    }
    let _reverseBlock: (NSDate) -> NSString = { date in
        let str: NSString = self.dateFormatter().stringFromDate(date)
        return str
    }
    let mtlTransformer = MTLValueTransformer.reversibleTransformerWithForwardBlock(_forwardBlock, reverseBlock: _reverseBlock)
    return mtlTransformer
}

func updatedAtJSONTransformer() -> NSValueTransformer {
    func forwardBlock(str: NSString?) -> NSDate {
        return self.dateFormatter().dateFromString(str!)
    }

    func reverseBlock(date: NSDate?) -> NSString {
       return self.dateFormatter().stringFromDate(date!)
    }

    return MTLValueTransformer.reversibleTransformerWithForwardBlock(forwardBlock, reverseBlock: reverseBlock)
}

また、ブロックにオプションの型引数を使用することもできます...

func createdAtJSONTransformer() -> NSValueTransformer {
    let _forwardBlock: (String?) -> NSDate = { str in
        let date: NSDate = self.dateFormatter().dateFromString(str!)
        return date
    }
    let _reverseBlock: (NSDate?) -> NSString = { date in
        let str: NSString = self.dateFormatter().stringFromDate(date!)
        return str
    }
    let mtlTransformer = MTLValueTransformer.reversibleTransformerWithForwardBlock(forwardBlock, reverseBlock: reverseBlock)
    return mtlTransformer
}

func createdAtJSONTransformer() -> NSValueTransformer {
    func forwardBlock(str: NSString?) -> NSDate {
        return self.dateFormatter().dateFromString(str!)
    }

    func reverseBlock(date: NSDate?) -> NSString {
        return self.dateFormatter().stringFromDate(date!)
    }

    return MTLValueTransformer.reversibleTransformerWithForwardBlock(forwardBlock, reverseBlock: reverseBlock)
}

xcode でオートコンプリートを使用すると、一致するものを探していることがわかります。

MTLValueTransformer.reversibleTransformerWithForwardBlock(forwardBlock: MTLValueTransformerBlock?, reverseBlock: MTLValueTransformerBlock?)

最後に、すべての例(失敗)で、最初の引数の名前を指定しようとしました。

MTLValueTranso.reversibleTransformerWithForwardBlock(forwardBlock: _forwardBlock, reverseBlock: _reverseBlock)

どんな助けや指導も大歓迎です - ありがとう!

4

2 に答える 2

3

私は最終的にそれを動作させました:

func createdAtJSONTransformer() -> NSValueTransformer {
    let _forwardBlock: MTLValueTransformerBlock? = { str in
        return self.dateFormatter().dateFromString(str as String!)
    }
    let _reverseBlock: MTLValueTransformerBlock? = { date in
        return self.dateFormatter().stringFromDate(date as NSDate!)
    }
    return MTLValueTransformer.reversibleTransformerWithForwardBlock(_forwardBlock, reverseBlock: _reverseBlock)
}

typedef (typealias?) を使用してブロックの型を設定します。

于 2014-06-08T02:46:47.303 に答える