前言:我主要是一个 obj-c && swift n00b。在过去的一年里,我通过使用 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)
非常感谢任何帮助或指导 - 谢谢!