【问题标题】:Swift Extension For Generic type compiler error通用类型编译器错误的 Swift 扩展
【发布时间】:2016-10-07 11:16:18
【问题描述】:

我已经为 NSData 泛型类型 (https://github.com/aschuch/AwesomeCache) 创建了 Cache 类的扩展

第一种方法工作正常,但 setIntegerValue 显示编译器错误: “无法使用类型为 '(NSData, forKey: String, expires: CacheExpiry)' 的参数列表调用 'setObject'”在行:self.setObject(data, forKey: forKey, expires: expires)

extension Cache where T: NSData {
    func integerForKey(key: String) -> Int? {
        if let data = self.objectForKey(key), string = String(data: data, encoding: NSUTF8StringEncoding), intValue = Int(string) {
            return intValue
        }
        return nil
    }

    func setIntegerValue(integerValue: Int, forKey: String, expires: CacheExpiry = .Never) {
        let stringValue = String(integerValue)
        if let data = stringValue.dataUsingEncoding(NSUTF8StringEncoding) {
            self.setObject(data, forKey: forKey, expires: expires)
        }
    }
}

我创建了没有扩展的测试,效果很好:

let cache = try! Cache<NSData>(name: "MyCache")
let string = "foo"
if let data = string.dataUsingEncoding(NSUTF8StringEncoding) {
    cache.setObject(data, forKey: "bar")
}

所以,我不明白发生了什么?谁能告诉我 - 出了什么问题?

【问题讨论】:

  • extension Cache where T: NSData — 我认为 Swift 只允许在 extension/where 类型约束中使用协议。它甚至不适用于NSData

标签: ios swift generics


【解决方案1】:

问题在于data 是一个NSData,但setObject 将一个T 作为它的第一个参数。不是 NSData。

您确实为T:NSData 定义了此扩展名,但这对 Swift 无关紧要。

【讨论】:

  • 我想你可以通过编写setObject(data as! T ... 来编译它,但我不知道运行时会发生什么。 :) 宇宙可能会爆炸。
  • func integerForKey(key: String) ... 有代码: if let data = self.objectForKey(key) - 它不返回 'T' 但 NSDada,那么 Swift 有什么区别那个方法参数应该是T,但是返回类型是NSData?
猜你喜欢
  • 2019-08-31
  • 2016-07-11
  • 2011-03-15
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多