1

Swift では、Equatable に準拠した型でジェネリックの配列をどのように定義しますか?

例:

struct File<T: Equatable> {
    public var lines: [T]
    private var lineCursor = 0
    public var currentLine: T {
        get { return lines[lineCursor] }
        set { lineCursor = lines.index(where: { $0 == newValue }) ?? 0 }
    }
}

struct Folder {
    public var files: [File]? // compile time error
}

→ ジェネリック型 'File' への参照には <…> の引数が必要です

…これまでのところ、私は試しました:

[File<Any>]

→ タイプ「Any」はプロトコル「Equatable」に準拠していません


[File<Any: Equatable>]

→ 行内の連続した宣言は、';' で区切る必要があります。


[File<Any, Equatable>]

→ あまりにも多くの型パラメーターで特殊化されたジェネリック型 'File' (取得したのは 2 ですが、1 である必要があります)


[File<Any & Equatable>]

→ プロトコル「Equatable」に準拠する具象型として「Equatable」を使用することはサポートされていません


[File<(Any: Equatable)>]

→ 要素ラベルを持つ単一要素のタプルは作成できません


[File<(Any, Equatable)>]

→ タイプ '(Any, Equatable)' はプロトコル 'Equatable'` に準拠していません


[File<(Any & Equatable)>]

→ プロトコル「Equatable」に準拠する具象型として「Equatable」を使用することはサポートされていません


[File<[Any: Equatable]>]

→ 'File' は 'Equatable' が 'Equatable' に準拠している必要があります


[File<[Any, Equatable]>]

→ 行内の連続した宣言は、';' で区切る必要があります。


[File<[Any & Equatable]>]

→ 'File' は 'Equatable' が 'Equatable' に準拠している必要があります


正しい構文は何ですか?


[編集]例を簡略化


[編集] 更新された例:

class File<T: Equatable> {
    var lines = [T]()
    var lineCursor: Int = 0
    var currentLine: T {
        get { return lines[lineCursor] }
        set { lineCursor = lines.index(where: { $0 == newValue }) ?? 0 }
    }
    var visible = true
}

class Folder {
    var files = [File]() // Generic parameter 'Type' could not be inferred; I want this to be a mixed array
    func currentLinesFromVisibleFiles() -> String {
        return files.filter({ $0.visible }).map({ String(describing: $0.currentLine) }).joined(separator: "/")
    }
}

var stringFile = File<String>()
stringFile.lines = ["strong", "string", "a", "b", "c"]
stringFile.currentLine = "string"
stringFile.visible = true

var intFile = File<Int>()
intFile.lines = [6, 12, 0, 489]
intFile.currentLine = 489
intFile.visible = true

var doubleFile = File<Double>()
doubleFile.lines = [92.12, 4.9753, 1.6]
doubleFile.currentLine = 92.12
doubleFile.visible = false

var boolFile = File<Bool>()
boolFile.lines = [true, false]
boolFile.currentLine = true
boolFile.visible = true

var folder = Folder()
folder.files = [stringFile, intFile, doubleFile, boolFile]

let output = folder.currentLinesFromVisibleFiles() // I want: "string/489/true"
4

1 に答える 1