generics - swift 中的一般问题

标签 generics swift

我定义了这样一个协议(protocol):

public protocol JSONConvertible {
    typealias T

    class func fromDictionary(dict: NSDictionary) -> T?
    class func fromArray(arr: NSArray) -> Array<T>
}

fromDictionary 将字典转换为对象,例如 User,fromArray 将利用 fromDictionary 将 NSArray 转换为数组。

我想做的是提供一个 BasicObject,它为 fromArray 提供默认实现,比如:

public class BasicObject<T>: JSONConvertible {

    public class func fromDictionary(dict: NSDictionary) -> T? {
        return nil
    }

    public class func fromArray(arr: NSArray) -> Array<T> {
        var result = Array<T>()

        for obj in arr {
            if let object: T = self.fromDictionary(obj as NSDictionary) {
                result.append(object)
            }
        }

        return result
    }

}

然后 User 类将从 BasicObject 继承。

但是,当我像在 Java 中那样执行此操作时,它告诉我该类也必须是通用的:

public class User: BasicObject<User> {}

那么代码就变成了:

public class User<User>: BasicObject<User> {}

首先这看起来很奇怪,其次当我初始化一个对象时它会是:

var user = User<User>()

并且无法通过编译(错误:无法构造,因为它没有可访问的初始化器)。

那么我该怎么做才能达到我的目的呢?谢谢。

最佳答案

错误是因为我在测试用例中初始化它并且 init() 不是公开的。

Also User<User> can be anything like User<Int>()

类型别名解决方案如下:

typealias user = User<Int>

然后你可以初始化你的对象:

user()

However the User<Int> brings unnecessary <Int> and it looks really weird.

关于generics - swift 中的一般问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26880905/

相关文章:

java - 接口(interface)中的继承

java - 如何强制转换 List<T> 以便能够调用相应对象上的特定方法?

swift - Webkit (swift) 不打开任何页面

ios - 隐藏和取消隐藏选项卡栏时管理 View 框架

swift - 在 case 语句中覆盖一系列字符串?

ios - 如果应用程序正在使用 GPS,即使应用程序处于后台,如何避免电池耗尽

swift - 为什么我不能返回一个从声明为 "-> () -> some View"的 Swift 函数返回 View 的闭包?

java - 反射(reflect)具有泛型类型参数的方法时出现 NoSuchMethodException

Swift - 为什么协议(protocol)仍然被视为通用的,即使 where 子句已经专门化了关联类型?

c# - 创建计算数字 T 平均值的通用类