gpt4 book ai didi

ios - 如何在 Swift 中使用 Github Mantle 的 MTLValueTransformer?

转载 作者:可可西里 更新时间:2023-10-31 23:59:30 26 4
gpt4 key购买 nike

前言:我主要是一个 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
}

当使用下面的实现时,我总是收到类似于以下的错误:

'任何对象!'不是“NSString”的子类型

无法转换表达式的类型“MTLValueTransformer!”键入“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)
}

也尝试为 block 使用可选类型参数......

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)

非常感谢任何帮助或指导 - 谢谢!

最佳答案

从 Mantle 2.0 开始,上面提供的答案不起作用。

原因是 MTLValueTransformerBlock 已更改为具有 3 个参数,并且 reversibleTransformerWithForwardBlock:reverseBlock 已弃用。

这是一个在 2.0 中有效的例子。 (注意ISO8601DateFormatter是单例,而我的函数刚好是类函数)

class func dateTransformer() -> NSValueTransformer {
let _forwardBlock: MTLValueTransformerBlock? = { (value, success, error) in
return ISO8601DateFormatter.sharedDateFormatter.dateFromString(value as! String!)
}
let _reverseBlock: MTLValueTransformerBlock? = { (value, success, error) in
return ISO8601DateFormatter.sharedDateFormatter.stringFromDate(value as! NSDate!)
}

return MTLValueTransformer(usingForwardBlock:_forwardBlock, reverseBlock:_reverseBlock)
}

关于ios - 如何在 Swift 中使用 Github Mantle 的 MTLValueTransformer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24102045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com