【问题标题】:Swift : Type XXX must conform to protocol 'NSObjectProtocol'Swift:类型 XXX 必须符合协议 'NSObjectProtocol'
【发布时间】:2014-11-08 07:18:17
【问题描述】:

我正在尝试实现一个必须的 Swift 类

  1. 从 Objective-C 类继承
  2. 使用类变量实现 Objective-C 协议。

虽然我子类化的 Objective-C 类是从 NSObject 继承的,但我收到以下编译错误:

Type DDBItem must conform to protocol 'NSObjectProtocol'

我继承/实现的 Objective-C 类和 Objective-C 协议可在 https://github.com/aws/aws-sdk-ios/blob/master/DynamoDB/AWSDynamoDBObjectMapper.h

AWSDynamoDBModel 有很长的继承链,最终以 NSObject 开始 AWSDynamoDBModeling 强制执行两个类变量。

我的代码是

class DDBItem : AWSDynamoDBModel, AWSDynamoDBModeling {

//    class var dynamoDBTableName : String { get { return "" }}
//    class var hashKeyAttribute  : String { get { return "" }}

    class func dynamoDBTableName() -> String! {
        return ""
    }
    class func hashKeyAttribute() -> String! {
        return ""
    }
}

奖励问题:当尝试将 Objective-C 协议强制类变量实现为 Swift 类变量时,我收到编译错误:

Type DDBItem must conform to protocol 'AWSDynamoDBModeling'

似乎可以接受将它们作为函数来实现。为什么?

【问题讨论】:

  • 第二个问题,property就是语法糖,在做桥接的时候,我猜编译器对OC property做了语法糖映射,让它们像Swift中的property。但是 OC 中没有类级别的属性,并且 +() 是一个方法,编译器只是将它映射到一个快速的类级别方法。只能用 A.classmethod() 调用。
  • 对于第一个问题,我不知道发生了什么。即使您从直接从 NSObject 继承的 MTLModel 继承,错误仍然存​​在。这意味着深层嵌套不是问题,而是 MLTModel 实现。
  • 好点,我来看看 MLTModel 的实现
  • mmmh,直接继承自 MTLModel 作品 ... class DDBItem : MTLModel
  • 但是一旦我添加协议,编译错误就会出现(类型必须符合 NSObjectProtocol),即使使用“class DDBItem : NSOBject, AWSDynamoDBModeling {”

标签: ios objective-c swift amazon-dynamodb


【解决方案1】:

只是继承自 NSObject:

class DDBItem : NSObject, AWSDynamoDBModel, AWSDynamoDBModeling {

【讨论】:

  • 不,这不是正确的答案,因为 AWSDynamoDBModel 已经从 NSObject 继承,正如我原来的问题“AWSDynamoDBModel 有一个最终以 NSObject 开始的长链继承”中所述
【解决方案2】:

为了存档而自行回答。

添加时

override func isEqual(anObject: AnyObject?) -> Bool {
    return super.isEqual(anObject)
}

对我的班级来说,它有效。 这个方法应该是继承自基类的。

在我看来,这就像 Swift / Xcode 6.1 中的一个错误

【讨论】:

  • 我刚刚用 Xcode 6.3 和 Swift 1.2 再次测试了这个问题,这个问题已经修复了!
  • stackoverflow.com/questions/24991018/… 让我得到了不同的答案:我的类需要将 NSObject 添加到继承列表中
  • 从 NSObject 继承,这是一个更干净的解决方案
  • 正如我原来的问题所述:“AWSDynamoDBModel 有一个很长的继承链,最终以 NSObject 开始”
  • 当我在 2014 年这样做时,这是唯一的答案。
【解决方案3】:

只是提醒那些偶然发现这篇文章的人。 AWSDynamoDBModeling 协议已在最新 SDK (v2.1.1) 中更改。所需功能: dynamoDBTableNamehashKeyAttribute 必须是静态的。截至今天(2015 年 5 月 27 日)的文档似乎已过时。

例子:

class Dingle:AWSDynamoDBObjectModel, AWSDynamoDBModeling {

    static func dynamoDBTableName() -> String! {
        return "dev_coupons"
    }

    static func hashKeyAttribute() -> String! {
        return "status "
    }

    func rangeKeyAttribute() -> String! {
        return "post_date"
    }

    override func isEqual(object: AnyObject?) -> Bool {
        return super.isEqual(object)
    }
}

【讨论】:

    【解决方案4】:

    确认!这样写函数:

    static func dynamoDBTableName() -> String {
    
    
        return "pb_Test"
    
    }
    
    
    static func hashKeyAttribute() -> String {
    
    
    
        return "ID"
    }
    

    你必须包括这个:

    override func isEqual(anObject: AnyObject?) -> Bool {
       return super.isEqual(anObject)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多