【问题标题】:RealmSwift initialize list : Cannot specialize a non-generic definitionRealmSwift 初始化列表:无法专门化非泛型定义
【发布时间】:2017-11-16 18:24:57
【问题描述】:

您好,我有一个例外,例如“无法专门化非泛型定义” 当我尝试在 Realm 对象中初始化 List 时。有谁知道如何解决这个问题?迅捷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() } 
}

【问题讨论】:

  • 有没有可能你没有导入RealmSwift 并且List 类型存在于你项目的另一部分?你可以试试:let dogs = RealmSwift.List&lt;Dog&gt;()
  • 不,我导入了:import Foundation import UIKit import Alamofire import RealmSwift import ObjectMapper import ObjectMapper_Realm import SwiftyJSON import BFKit
  • 非常感谢,但是“RealmSwift.List()”正在工作,而不是“List()”。但在我的其他项目中,“List()”运行良好,我很困惑。
  • 那似乎是名称冲突。您必须四处寻找其他名为 List 的结构/类。
  • 是的,还有一个 struct List :)

标签: swift list realm


【解决方案1】:

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

我对您提出的错误的推理如下

  1. 在 Realm 中,您发布的内容正是 how you're supposed to declare a list
  2. 您的示例在我的项目上下文中编译,该项目已经使用 Realm Lists
  3. 显示的错误表明 swift 编译器知道 List 是一个有效类型,并且实际上知道一个名为 List.init() 的函数,但是编译器告诉您该函数不是泛型的。

此时唯一的答案是假设编译器使用的 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
}

幸运的是,类型/函数通常有很大的不同,因此您不会在不经意间使用错误的类型而最终不会遇到错误,例如您遇到的错误。

【讨论】:

  • 这很棒。我被困了好几个小时试图弄清楚该怎么做。我无法返回我需要返回的功能。谢谢! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多