2

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

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

4

2 回答 2

5

从 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)
}
于 2015-04-22T21:46:09.503 回答
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 回答