序文:私は主に 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)
どんな助けや指導も大歓迎です - ありがとう!