Я пытаюсь, чтобы функция принимала общий ввод, который соответствует как классу, так и протоколу, чтобы обрабатывать значения, где некоторые принадлежат классу, а другие принадлежат делегату. Он отлично работает для отдельных типов, но не для массива типов (которые соответствуют как суперклассу, так и делегату). Вместо этого компилятор выдает ошибку. Метод экземпляра «printValues (for:)» требует, чтобы «MeasurementClass» соответствовал «UnitDelegate».
Я добавил код ниже, который будет иметь гораздо больше смысла. Просто поместите его в Swift Playground. Если вы запустите его как есть, вы увидите, что он правильно печатает расстояние и шаги пользователя по отдельности. Если вы раскомментируете последние несколько строк, ту же функцию нельзя будет использовать с массивом.
Моя цель состоит в том, чтобы иметь возможность передавать массив типов, соответствующих UnitDelegate и MeasurementClass (он же псевдоним типа MeasurementObject), и обрабатывать значения. Я хочу массив, потому что мне понадобится куча разных классов, соответствующих MeasurementObject.
protocol UnitDelegate: class{
var units: [String: String] { get }
}
class MeasurementClass{
var imperial: Double!
var metric: Double!
convenience init(imperial: Double, metric: Double){
self.init()
self.imperial = imperial
self.metric = metric
}
}
typealias MeasurementObject = MeasurementClass & UnitDelegate
class Distance: MeasurementObject{
var units = ["imperial": "miles", "metric":"kms"]
}
class Steps: MeasurementObject{
var units = ["imperial": "steps", "metric":"steps"]
}
class User{
func printValues<T: MeasurementObject>(for type: T) {
print("\(type.imperial!) \(type.units["imperial"]!) = \(type.metric!) \(type.units["metric"]!)")
}
}
//This is what I'm trying to achieve in the for loop below
let distance = Distance(imperial: 30, metric: 48.28)
let steps = Steps(imperial: 30, metric: 30)
let user = User()
user.printValues(for: distance)
user.printValues(for: steps)
//let types = [distance, steps]
//
//for type in types{
// user.printValues(for: type)
//}