基类静态方法返回Swift中的子类类型

基类静态方法返回Swift中的子类类型,swift,generics,types,Swift,Generics,Types,我想要一个基类静态方法,它返回子类类型的数组。这是我当前的实现。它可以工作,但我有一个小问题 class Animal { required init() { } public static func generateMocks<T: Animal>() -> [T] { var mocks: [T] = [] // some implementation goes here... for _ in 0..<

我想要一个基类静态方法,它返回子类类型的数组。这是我当前的实现。它可以工作,但我有一个小问题

class Animal {
    required init() { }
    public static func generateMocks<T: Animal>() -> [T] {
        var mocks: [T] = []
        // some implementation goes here...
        for _ in 0..<10 {
            mocks.append( T() )
        }
        //
        return mocks
    }
}


let myMockAnimals: [Animal] = Animal.generateMocks() // this gives me type [Animal]

class Dog: Animal {
    // dog things
    var isCute = true
}

let myMockDogs: [Dog] = Dog.generateMocks() // this gives me type [Dog]
print(myMockDogs.first?.isCute) // true

/* My problem is that it is very annoying to have to declare my
   myMockDogs variable as type "[Dog]". I would like it to
   automatically infer this type. Like this: */

let myMockDogs2 = Dog.generateMocks() // oh no! It gives me type [Animal]
print(myMockDogs2.first?.isCute) // error! Value of type 'Animal' has no member 'isCute'
if let dog = myMockDogs2.first! as Dog { // error! 'Animal' is not convertible to 'Dog';
    print(dog)
}
因此,当我指定期望的对象类型时,我的泛型静态函数generateMocks能够返回正确的子类,如let myMockDogs2:[Dog]=…,但当我删除期望的显式类型时,如let myMockDogs2=。。。然后它突然又回到使用Animal作为泛型函数的类型,从而生成一个数组[Animal]

是否有办法修改generateMocks函数,使myMockDogs2=Dog.generateMocks自动将类型Dog用于泛型T


你也可以把这个代码复制到操场上!它在那里工作!我真的很害怕这个问题没有解决方案,但也许一个敏捷的天才有一个想法。

一个可能的解决方案是协议扩展

protocol Animal {
    init()
    static func generateMocks() -> [Self]
}

extension Animal {
    static func generateMocks() -> [Self] {
        var mocks: [Self] = []
        // some implementation goes here...
        for _ in 0..<10 {
            mocks.append( Self() )
        }
        //
        return mocks
    }
}

struct Dog: Animal {
    // dog things
    var isCute = true
}

let myMockDogs = Dog.generateMocks()
print(myMockDogs.first?.isCute) // true

无法返回Self数组,因为会出现错误:“Self”仅在协议中可用,或作为类中方法的结果;你是说“动物”吗?您可以只返回一个单独的Self对象,但不能返回它们的数组。@matt我不确定您的意思,但是Self在Animal中的静态方法上下文中可能总是指Animal,即使它被狗静态调用……很好!我希望它是一个类,而不是一个结构,但我已经设法做到了。非常感谢。