Как в 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<Any>]
→ Тип «Любой» не соответствует протоколу «Равный».
[File<Any: Equatable>]
→ Последовательные объявления в строке должны быть разделены символом ';'
[File<Any, Equatable>]
→ Универсальный тип «Файл», специализирующийся на слишком большом количестве параметров типа (получено 2, но ожидается 1)
[File<Any & Equatable>]
→ Использование Equatable в качестве конкретного типа, соответствующего протоколу Equatable, не поддерживается.
[File<(Any: Equatable)>]
→ Невозможно создать одноэлементный кортеж с меткой элемента
[File<(Any, Equatable)>]
→ Тип '(Any, Equatable)' не соответствует протоколу 'Equatable'
[File<(Any & Equatable)>]
→ Использование Equatable в качестве конкретного типа, соответствующего протоколу Equatable, не поддерживается.
[File<[Any: Equatable]>]
→ «Файл» требует, чтобы «Equatable» соответствовал «Equatable»
[File<[Any, Equatable]>]
→ Последовательные объявления в строке должны разделяться знаком ';'
[File<[Any & Equatable]>]
→ «Файл» требует, чтобы «Equatable» соответствовал «Equatable»
Какой правильный синтаксис?
[EDIT] упростил пример
[РЕДАКТИРОВАТЬ] обновленный пример:
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"
Data
иFile
?String
?Int
? Это то, что вам нужно использовать, а неAny
. - person rmaddy   schedule 13.05.2018Data
типе? Я действительно не вижу смысла определять тип с единственным свойством экземпляра с неограниченным универсальным типом. Почему бы вам просто не использоватьpublic var lines: [Type]
в своемFile
типе? Более того, копирование существующих встроенных имен типов - плохая идея, так как это, скорее всего, приведет к путанице для читателей вашего кода. - person Dávid Pásztor   schedule 13.05.2018Float
иBool
, а также любые будущие пользовательские типы, которые являются Equatable. - person Rudy Phillipps   schedule 13.05.2018File
илиData
, вам нужно сделать это с определенным (и Equatable) типом.Any
неEquatable
. - person rmaddy   schedule 13.05.2018Type
? - person Rudy Phillipps   schedule 13.05.2018File
иFolder
. - person rmaddy   schedule 13.05.2018Data
. Проблема с вашим текущим подходом заключается в том, что не существует типаFile
без указания компилятору, какой тип вы оборачиваете вFile
в качестве универсального типа. Точно так же, как не существует типаOptional
илиArray
без параметров общего типа. По сути, вы ищетеFile<Equatable>
, но это также не может работать, поскольку вы не можете использоватьEquatable
как конкретный тип. Не зная точно, чего именно вы пытаетесь достичь, одним из возможных решений могло бы стать созданиеEquatable
со стиранием типа и сохранение его массива вFolder
. - person Dávid Pásztor   schedule 13.05.2018