簡體   English   中英

使用NSObject繼承對Swift通用類進行子類化

[英]Subclassing Swift Generic Class with NSObject inheritance

我遇到了一個錯誤,我不確定它是否是Swift語言或bug的限制。 這是最基本的前提:

class GenericClass<T> : NSObject {

    var inputValue: T

    init(value: T) {
        self.inputValue = value
        super.init()
    }
}

class SubClass : GenericClass<String> {

    override init(value: String) {
        super.init(value: value)
        }

  }

var test = GenericClass(value: "test") //Succeeds
var test2 = SubClass(value: "test2") //Fails with EXC_BAD_ACCESS

我這里沒有編譯器警告,但是Subclass拒絕實例化。 我在子類化泛型的特定上下文中有一個更復雜的目標,但上面的這個基本問題是我把它歸結為。

有趣的是,如果我刪除GenericClass上的NSObject繼承(和泛型的init方法中的super.init()),這個設置沒有問題,所以我認為它必須與我的事實有關繼承自NSObject。 我的完整實現必須繼承自NSOperation(我基本上是使用泛型超類生成自定義的NSOperation類),所以從NSObject繼承(即NSOperation)對我來說不是可選的。

令人討厭的是沒有編譯器錯誤,我得到的東西和EXC_BAD_ACCESS一樣令人討厭。 這讓我覺得這可能是有用的,但目前還不行。 我知道他們最近才開始支持Swift中泛型類的子類化。 我正在運行最新的xCode beta 6。

有任何見解贊賞!

我很確定這是一個錯誤。 有趣的是,如果刪除初始值設定項,即使從NSObject繼承,一切正常:

class GenericClass<T> : NSObject {

}

class SubClass : GenericClass<String> {

}

var test : GenericClass<Int> = GenericClass() // Succeeds
var test2 = SubClass() // Succeeds
var test3 : GenericClass<String> = SubClass() // Succeeds
var test4 : GenericClass<Int> = SubClass() // Fails ("cannot convert SubClass to GenericClass<Int>")

一個混亂的解決方法可能是使用默認協議實現,然后擴展NSOperation以從您的協議初始化新操作,但最好只提交錯誤報告並等待他們修復此問題:)

import Foundation

class GenericClass<T> : NSObject {

    var inputValue: T

    init(value: T) {
        print(value)
        inputValue = value
        super.init()

    }
}

class SubClass<T> : GenericClass<T> {

    override init(value: T) {
        super.init(value: value)
    }

}

let test = GenericClass(value: "test") //Succeeds
test.inputValue
let test2 = SubClass(value: "test2")   //Succeeds
test2.inputValue
let test3 = GenericClass(value: 3.14)  //Succeeds
test3.inputValue
let test4 = SubClass(value: 3.14)      //Succeeds

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM