Dja*_*ngo 9 parameters pointers object ios swift
我正在尝试编写一个函数,它接受一个变量指针和一个描述符/键,并为变量设置一个新值.理想情况下,指针应该是对象或基元,但我也可以使用单独的函数(或其他参数).在我的代码中,我也使用键从数据库中检索新值,但在下面的示例中,我使用虚拟值对其进行了简化,以便可以在操场中轻松使用:
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")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
"无法使用类型'的参数列表调用'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")
Run Code Online (Sandbox Code Playgroud)
这也给出了同样的错误:
"无法使用类型'的参数列表调用'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)")
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道我在这里缺少什么?任何帮助深表感谢!
谢谢!
更好的是你可以创建如下的通用方法:
func setValue<T>(inout object:T, key: String) {
switch key {
case "String":
object = ("A String" as? T)!
case "UIColor":
object = (UIColor.whiteColor() as? T)!
case "Bool":
object = (true as? T)!
default:
println("Unhandled key: \(key)")
}
}
Run Code Online (Sandbox Code Playgroud)
呼叫将是这样的:
setValue(&string, key: "String")
setValue(&color, key: "UIColor")
setValue(&bool, key: "Bool")
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!
正确的方法是使用重载,让编译器在编译时选择适当的代码位,而不是在运行时关闭字符串:
func setValue(inout object: String) {
object = "A String"
}
func setValue(inout object: UIColor) {
object = UIColor.whiteColor()
}
func setValue(inout object: Bool) {
object = true
}
func setValue(inout object: Any) {
println("Unhandled key: \(key)")
}
Run Code Online (Sandbox Code Playgroud)
当你有一个Any并且你想要向函数指示包含在Any... 中的类型时,这种方法是行不通的...但在这种情况下,你遇到问题的原因是编译器确实知道类型是什么,所以你可以采取优点.
| 归档时间: |
|
| 查看次数: |
13573 次 |
| 最近记录: |