Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift泛型超类&x27;构造其子类时无法访问init_Ios_Swift - Fatal编程技术网

Ios Swift泛型超类&x27;构造其子类时无法访问init

Ios Swift泛型超类&x27;构造其子类时无法访问init,ios,swift,Ios,Swift,我有以下代码: class ILProperty<T> { var value: T? init(_ value: T) { self.value = value } } typealias ILStringProperty = ilStringProperty<String> class ilStringProperty<String>: ILProperty<String> { } let x = I

我有以下代码:

class ILProperty<T> {
    var value: T?
    init(_ value: T) {
        self.value = value
    }
}

typealias ILStringProperty = ilStringProperty<String>
class ilStringProperty<String>: ILProperty<String> {
}

let x = ILStringProperty("X")
可以,但我不喜欢。当我不添加/修改它时,为什么需要覆盖它

我做错什么了吗

更新:尼基塔·列昂诺夫和伊卡洛回答的后续问题

首先,关于所有属性都必须有默认值,我认为我满足了这个规则,可选的var默认为nil值,不是吗?即使我写
var值:T?=nil
无法解决此问题

然后从同一节“自动初始值设定项继承”:

如果满足某些条件,超类初始值设定项将自动继承

一个条件是:

如果您的子类没有定义任何指定的初始值设定项,它将自动继承其所有超类指定的初始值设定项

我确实认为上面的代码符合。如果我不使用泛型,这实际上会起作用:

class ILProperty {
    var value: Any?
    init(_ value: Any) {
        self.value = value
    }
}
class ILStringProperty: ILProperty {
}
let x = ILStringProperty("X")
此规则是否也适用于泛型类?

来自:

Swift为任何结构或基类提供默认初始值设定项 为其所有属性提供默认值,但不 至少提供一个初始值设定项本身。默认初始值设定项 只需创建一个新实例,并将其所有属性设置为 默认值


您的类ilStringProperty不是基类,因为它继承自ILProperty,因此它必须有一个初始值设定项,如果您创建一个或重写一个初始值设定项,这并不重要,因为您的类中至少有一个初始值设定项,因为swift不会免费提供一个初始值设定项。

以下是Apple文档中的另一个引用

与Objective-C中的子类不同,Swift子类不继承 默认情况下,它们的超类初始值设定项。斯威夫特的方法阻止了一场战争 继承超类中的简单初始值设定项的情况 由更专门化的子类创建,并用于创建 未完全或正确初始化的子类

在“初始值设定项继承和重写”一节中


我不理解您的沮丧,但斯威夫特处理初始值设定项的方法在概念上更好。

代码示例的最后一行不再给出编译错误(因为斯威夫特3)。在中没有提到这一点,因此我只能假设这是一个bug。

如前所述,它似乎可以与最新的Swift(3.0)配合使用。另外,为什么要声明一个单独的类来分配给
typealias
?我在操场上试过这个,看起来还可以:

class ILProperty<T> {
    var value: T?
    init(_ value: T) {
        self.value = value
    }
}

typealias ILStringProperty = ILProperty<String>
let x = ILStringProperty("X")
class属性{
var值:T?
初始值(u值:T){
自我价值=价值
}
}
typealias ILStringProperty=ILProperty
设x=ILStringProperty(“x”)

Hm.你说得对。考虑到这些规则,它应该继承。它适用于非泛型类,但在泛型类上失败——这是一个非常有趣的例子。我在苹果开发者论坛上也发现了类似的问题,但还没有得到回答-感谢类似的问题链接在你粘贴的阶段之后还有一个注释。
class ILProperty<T> {
    var value: T?
    init(_ value: T) {
        self.value = value
    }
}

typealias ILStringProperty = ILProperty<String>
let x = ILStringProperty("X")