Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift无法从Swift.X转换为Swift.X.Type_Swift_Xcode - Fatal编程技术网

Swift无法从Swift.X转换为Swift.X.Type

Swift无法从Swift.X转换为Swift.X.Type,swift,xcode,Swift,Xcode,我是Swift的新手,可能我没有经验了解Swift中的铸造工作原理,但我希望您能帮助我: let x:Int32 = db.valueByKey(key: ["integer_tgc":Int32.self]).AtIndexT(index: [2:Int32.self]); AtIndex是一个扩展,如下所示: extension Array { func AtIndex(index: Int) -> Any { retu

我是Swift的新手,可能我没有经验了解Swift中的铸造工作原理,但我希望您能帮助我:

let x:Int32 = db.valueByKey(key: ["integer_tgc":Int32.self]).AtIndexT(index: [2:Int32.self]);
AtIndex是一个扩展,如下所示:

extension Array {

    func AtIndex(index: Int) -> Any {
        
        return self[index];
    }
    
    func AtIndexT<T>(index: KeyValuePairs<Int,T>) -> T? {
        
        if let _record = index.first {
            
            let _key : T = self[_record.key] as! T;
            return _key;
            
        } else {
            
            return nil;
        }
    }
}


你得到的错误

对于上面的示例,编译器给出了“无法将“Int32.type”类型的值转换为指定的类型“Int32”

这是因为您正在将
KeyValuePairs
中的
Int32.self
作为
T
作为参数传递给函数,因此返回类型
T?
本身将变为
Int32.type?
。因此,当您试图将其分配给
Int32
类型的
x
时,编译器将抛出一个错误,因为强制转换将失败

因此,要解决此问题,您可以选择以下代码:

阵列扩展:

extension Array {
    func AtIndex(index: Int) -> Any {
        return self[index];
    }

    func AtIndexT<T>(index: KeyValuePairs<Int, T.Type>) -> T? {
        if let _record = index.first {
            let _key : T = self[_record.key] as! T;
            return _key;        
        } else {
            return nil;
        }
    }
}

注意:
x
可选的Int32
类型。

Thx!这就是诀窍!很高兴知道这有帮助!
extension Array {
    func AtIndex(index: Int) -> Any {
        return self[index];
    }

    func AtIndexT<T>(index: KeyValuePairs<Int, T.Type>) -> T? {
        if let _record = index.first {
            let _key : T = self[_record.key] as! T;
            return _key;        
        } else {
            return nil;
        }
    }
}
let x:Int32? = Int(db.valueByKey(key:["integer_tgc":Int32.self]).AtIndexT(index: [2:Int32.self]))