Swift/iOS:如何在AnyObject/Any或Pointers的函数中使用inout参数

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)

有没有人知道我在这里缺少什么?任何帮助深表感谢!

谢谢!

Soh*_*mon 9

更好的是你可以创建如下的通用方法:

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)

希望能帮助到你!

  • 如果你要强制投射(请不要,有更好的解决方案),你可以做'价值!事情`而不是`(价值为?事)! (3认同)

Air*_*ity 7

正确的方法是使用重载,让编译器在编译时选择适当的代码位,而不是在运行时关闭字符串:

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... 中的类型时,这种方法是行不通的...但在这种情况下,你遇到问题的原因是编译器确实知道类型是什么,所以你可以采取优点.