RealmSwift初始化列表:不能专门化非泛型定义

时间:2017-11-16 18:24:58

标签: swift list realm

嗨我有一个例外,例如“不能专门化非泛型定义” 当我试图在Realm对象中初始化List时。有谁知道如何解决这个问题? swift 3.2

class Dog: Object {
    @objc dynamic var name = ""
    @objc dynamic var age = 0 
}

class Event : Object{
    dynamic var event_id = 0
    dynamic var date : String?
    dynamic var name : String?
    dynamic var remind : Remind?
    dynamic var event_status = 0

    let dogs = List<Dog>()       "Cannot specialize a non-generic definition"

    required convenience init?(map: Map){ self.init() } 
}

1 个答案:

答案 0 :(得分:1)

我想在一些背景下给出这个问题的解决方案。在Swift中,命名空间是implicit on a module level。如果您有外部模块,例如RealmSwift,其类型为List,您仍可以在自己的模块中使用名为List的类型。您甚至可以拥有多个类型为List的外部模块。

我提出错误的原因如下

  1. 在Realm中,您发布的内容正是how you're supposed to declare a list
  2. 您的示例已在我的项目上下文中编译,该项目已使用Realm List s
  3. 指示错误表明swift编译器知道List是一个有效类型,实际上知道一个名为List.init()的函数,但编译器告诉你该函数不是通用的
  4. 此时唯一的答案是假设编译器使用的List定义与您想要的不同。发生这种情况的唯一方法是,您所在的范围(您的项目或其他类型)也定义了类型List,因为内部类型优先于外部类型。使用类型嵌套进一步扩展此优先级。如果您希望将Realm的List保留为默认列表,则可以将List嵌套在另一个结构中以提供各种命名空间。

    鉴于复杂情况,以下示例尽可能简洁。

    import RealmSwift
    
    let myGlobalDogs = List()
    let myGlobalNestedListDogs = MyClass.List()
    let globalDogs = RealmSwift.List<Dog>()
    
    class List { }
    
    class MyClass {
        class List { }
    
        let dogs = RealmSwift.List<Dog>()
        let myNestedListDogs = List() // type: MyModule.MyClass.List
        let myDogs = MyModule.List() // type: MyModule.List
    }
    
    class MyOtherClass {
    
        let dogs = RealmSwift.List<Dog>()
        let myNestedListDogs = MyClass.List() // type: MyModule.MyClass.List
        let myDogs = List() // type: MyModule.List
    }
    

    幸运的是,类型/函数通常是不同的,你不会无意中使用错误的类型/函数而不会遇到最终的错误,例如你遇到的错误。