【问题标题】:Swift Generic Function [duplicate]Swift 通用函数 [重复]
【发布时间】:2016-05-18 12:32:42
【问题描述】:

我正在尝试在类扩展中创建通用函数,但出现编译器错误。

我也有 A 类和 B 类,都扩展了 NSManagedObject

我想在我的类扩展中创建一个findOne() 函数。

extension NSManagedObject {
    public class func findOne() -> NSManagedObject {
    // some working stuff returning a NSManagedObject
    }
}

我的问题是:当我在A上使用这个方法时,返回类型是NSManagedObject

let aObject = A.findOne //type is NSManagedObject

所以,显然我可以转换它并获得一个 A 类对象

let aObject = A.findOne as! A//type is NSManagedObject

从这里开始,我想替换我的扩展实现以使用泛型,让我拥有:

let aObject = A.findOne //type is A

我试过这个:

extension NSManagedObject {
     public class func findOne<T>() -> T {
     // some working stuff returning a NSManagedObject
     }
}

但是A.findOne() 仍然是NSManagedObject 类型。

谁能帮帮我?

更新 如果我使用以下代码实际上可以工作:

 class func findOne<T : NSManagedObject>() -> T {
    //Do some stuff
   return myObject as! T
 }

let myObject : A = A.findOne()

【问题讨论】:

标签: ios swift macos generics


【解决方案1】:

您可以创建一个BaseModel,您的所有模型都继承自该BaseModel。使用泛型类型参数相应地转换对象

class BaseModel : NSManagedObject {

    class func find<T>(objectID: NSManagedObjectID) -> T
    {
        return someObjectContext.objectWithID(objectID) as! T
    }
}

class Person : BaseModel {

}


let person: Person = Person.find(someObjectId)

Generics

【讨论】:

  • A 和 B 都在扩展 NSManagedObject 所以你的回答不能解决我的问题:(
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 2015-12-17
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 2021-06-26
  • 1970-01-01
相关资源
最近更新 更多