Я пытаюсь написать функцию, которая принимает указатель переменной и дескриптор/ключ и устанавливает новое значение для переменной. В идеале указатель должен быть либо объектом, либо примитивом, но я также мог бы жить с отдельными функциями (или дополнительным параметром). В моем коде я извлекаю новое значение из базы данных также с помощью ключа, но в следующем примере я упростил его с помощью фиктивных значений, чтобы его можно было легко использовать на игровой площадке:
import UIKit
func setValue(inout object: AnyObject, key: String) {
switch key {
case "String":
object = "A String"
case "UIColor":
object = UIColor.whiteColor()
case "Bool":
object = true
default:
println("Unhandled key: \(key)")
}
}
var string: String = "Default String"
var color: UIColor = UIColor.blackColor()
var bool: Bool = false
setValue(&string, "String")
setValue(&color, "UIColor")
setValue(&bool, "Bool")
Я получаю следующую ошибку:
"Не удается вызвать setValue со списком аргументов типа "(inout String, key String)""
Я понимаю, что здесь я смешиваю объекты и примитивы. Я также пытался разбить его и разделить на две функции, но даже это не удалось:
func setValue(inout object: AnyObject, key: String) {
switch key {
case "UIColor":
object = UIColor.whiteColor()
default:
println("Unhandled key: \(key)")
}
}
var color: UIColor = UIColor.blackColor()
setValue(&color, "UIColor")
Это также дает ту же ошибку:
"Невозможно вызвать setValue со списком аргументов типа "(inout UIColor, key String)""
Если я изменю «AnyObject» на «UIColor», это сработает, но смысл функции в том, что она принимает любой тип переменной или, по крайней мере, любой тип объекта (тогда я бы написал вторую функцию, используя «Any» для примитивов, или добавил другой параметр)
В Objective-C я использовал указатели, перенос подхода на Swift также не работает, тот же результат:
func setValue(object: UnsafeMutablePointer<AnyObject>, key: String) {
switch key {
case "String":
object.memory = "A String"
case "UIColor":
object.memory = UIColor.whiteColor()
case "Bool":
object.memory = true
default:
println("Unhandled key: \(key)")
}
}
Кто-нибудь знает, что мне здесь не хватает? Любая помощь высоко ценится!
Спасибо!
value as! Thing
, а не(value as? Thing)!
. 30.04.2015