Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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 - Fatal编程技术网

在Swift中定义运行时的新类

在Swift中定义运行时的新类,swift,Swift,我想在运行时定义一个临时类,目标是创建用于测试的模拟对象。例如: class Foo { func bar(classType) { class Mock: classType { // class body } let m = Mock() ... } } 目前是否可以在Swift中执行类似操作?如果不是直接的,可能是通过泛型?这听起来像是在Ruby中可以做的事情。但是Swift与Ruby相

我想在运行时定义一个临时类,目标是创建用于测试的模拟对象。例如:

class Foo {
    func bar(classType) {
        class Mock: classType {
            // class body
        }
        let m = Mock()
        ...
    }
}

目前是否可以在Swift中执行类似操作?如果不是直接的,可能是通过泛型?

这听起来像是在Ruby中可以做的事情。但是Swift与Ruby相反:每个类型都必须在编译时完全定义


如果类类型在编译时是已知的,那么您的代码当然是合法的:在函数中定义一个类没有什么错,当然,当函数的其余部分运行时,它只在作用域中。但该类的超类必须在编译时定义良好;它不能推迟到运行时。

这听起来像是在Ruby中可以做的事情。但是Swift与Ruby相反:每个类型都必须在编译时完全定义


如果类类型在编译时是已知的,那么您的代码当然是合法的:在函数中定义一个类没有什么错,当然,当函数的其余部分运行时,它只在作用域中。但该类的超类必须在编译时定义良好;它不能推迟到运行时。

是和否;或者,也许是的,不是的

正如@matt的回答所指出的,快速打字非常静态。Swift中泛型系统的存在并没有改变这一点:所有类型仍然是静态的,因为它在编译时是已知的,例如,当您使用诸如func foot:t之类的泛型或创建数组时,使用哪个t。编译器必须了解类才能创建子类,因此不能在那里使用动态运行时信息。即使可以对泛型类型参数进行子类化,也必须对该参数进行约束,使编译器能够静态了解可能的超类


然而,Swift在苹果平台上使用Objective-C运行时并与之互操作;对不起,Linux etc用户上的开源Swift。因此,您可以使用来在运行时根据仅在运行时可用的知识动态地使用方法和属性填充它们。理论上,您甚至可以使用这些API和Swift代码生成的类。。。当然,它不会很漂亮,因为根据定义,Swift代码不会在编译时为动态创建的类提供静态类型信息;或者,也许是的,不是的

正如@matt的回答所指出的,快速打字非常静态。Swift中泛型系统的存在并没有改变这一点:所有类型仍然是静态的,因为它在编译时是已知的,例如,当您使用诸如func foot:t之类的泛型或创建数组时,使用哪个t。编译器必须了解类才能创建子类,因此不能在那里使用动态运行时信息。即使可以对泛型类型参数进行子类化,也必须对该参数进行约束,使编译器能够静态了解可能的超类


然而,Swift在苹果平台上使用Objective-C运行时并与之互操作;对不起,Linux etc用户上的开源Swift。因此,您可以使用来在运行时根据仅在运行时可用的知识动态地使用方法和属性填充它们。理论上,您甚至可以使用这些API和Swift代码生成的类。。。当然,它不会很漂亮,因为根据定义,Swift代码在编译时不会为动态创建的类提供静态类型信息。

如果classType是泛型类型,比如另外,classType需要什么类型才能从中继承?如果classType是泛型类型,另外,为了让Mock从中继承,classType需要是什么类型?这个答案非常详细。更令人惊奇的是,如果您展示了一个使用Swift中的ObjC运行时创建类并在运行时填充的示例,这个答案非常详细。但是,如果您展示了一个使用Swift中的ObjC运行时创建类并在运行时填充它的示例,那么更令人惊奇的是。