如何将OC JSContext[@“makeNSColor”更改为swift

如何将OC JSContext[@“makeNSColor”更改为swift,swift,javascriptcore,Swift,Javascriptcore,“JSContext”没有下标成员,oc正常,但swift不工作 我试过用swift 4 例如,OC是可以的 JSContext *context = [[JSContext alloc] init]; context[@"makeNSColor"] = ^(NSDictionary *rgb) {float r = rgb[@"red"].floatValue; float g = rgb[@"green"].floatValue; float b = rgb[@"blue"].floatVa

“JSContext”没有下标成员,oc正常,但swift不工作

我试过用swift 4

例如,OC是可以的

JSContext *context = [[JSContext alloc] init];
context[@"makeNSColor"] = ^(NSDictionary *rgb)
{float r = rgb[@"red"].floatValue;
float g = rgb[@"green"].floatValue;
float b = rgb[@"blue"].floatValue;
return [NSColor colorWithRed:(r / 255.f) green:(g / 255.f) blue:(b / 255.f) alpha:1.0];
};
Swift是一个错误:

var context = JSContext() as? JSContext     //Cannot assign value of type 'Any?' to type 'JSContext?'

        context!["makeNSColor"] = { rgb in     //Type 'JSContext' has no subscript member

            var r: Float = rgb?["red"].floatValue

            var g: Float = rgb?["green"].floatValue

            var b: Float = rgb?["blue"].floatValue

            return NSColor(red: CGFloat((r / 255.0)), green: CGFloat((g / 255.0)), blue: CGFloat((b / 255.0)), alpha: 1.0)

        }
它有两个错误:无法将类型“Any”的值赋给类型“JSContext”,类型“JSContext”没有下标成员,我不知道如何修复它,您能告诉我如何解决它吗,非常感谢


我试图改变环境!作为!NSMutableDictionary或[String,Any],但仍有错误,无法更改

let colorHandle: @convention(block) ([String : Any]) -> UIColor = { rgb in
    let r = rgb["red"] as! CGFloat
    let g = rgb["green"] as! CGFloat
    let b = rgb["blue"] as! CGFloat

    return UIColor(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: 1.0)
}

context?.setObject(colorHandle, forKeyedSubscript: "makeNSColor" as NSCopying & NSObjectProtocol)

我不知道什么是对象
makenColor
。但是如果它是
var makeNSColor={red:10/255,green:10/255,blue:255/255,a:1}
,下面是一个很好的示例,说明如何从dictionary
makeNSColor
创建UIColor:

    func f () {
        let context = JSContext()!
        let script = """
var makeNSColor = {red : 10/255, green : 10/255, blue : 255/255, a : 1};
"""
        let cc = context.evaluateScript(script).context // result is
        let val = cc?.objectForKeyedSubscript("makeNSColor")
        guard let dict = val?.toDictionary() as? [String : CGFloat] else {return}
        let color = UIColor(displayP3Red: dict["red"] ?? 0, green: dict["green"] ?? 0, blue: dict["blue"] ?? 0, alpha: dict["a"] ?? 0)

        print(color)
    }
如果要在JS中创建
makenColor
作为
Dictionary
,请使用下一个函数:

    func addColor (r : Float, g : Float, b : Float) {
        let context = JSContext()!
        let script = """
var makeNSColor = {red : \(r)/255, green : \(g)/255, blue : \(b)/255, a : 1};
"""
        let cc = context.evaluateScript(script).context // result is

        // next code only needed to check the `makeNSColor`
        let val = cc?.objectForKeyedSubscript("makeNSColor")
        guard let dict = val?.toDictionary() as? [String : CGFloat] else {return}
        let color = UIColor(displayP3Red: dict["red"] ?? 0, green: dict["green"] ?? 0, blue: dict["blue"] ?? 0, alpha: dict["a"] ?? 0)

        print(color)
    }

您是否阅读了文档,是否在线搜索解决方案?让context=JSContext()怎么办那么使用
objectforkeydsubscript
来获得这个值呢?你在苹果论坛上问过吗?在回答中给出的推荐链接中:“相反,您可以通过调用setObject(uuu:forkeydsubscript:)方法将Swift值设置为JSContext中的变量。”在JS中显示定义或值
makenColor