Tag: generics

返回被调用的types的对象的方法

所以我有两个类Base和More看起来像这样 class Base:NSObject { class func whatsMineType() -> Base { return Base() } } class More:Base { } 如果我调用方法Base.whatsMineType()和More.whatsMineType() ,他们都给了我的对象types的Base 。 有没有办法修改方法whatsMineType() ,而不重写它在Base ,所以它会返回被调用的types的对象? 我的目标是Base.whatsMineType()将返回Basetypes对象和More.whatsMineType()将返回Moretypes的对象。 我已经尝试过generics,但我没有太多的经验。 任何build议将超级赞赏。 编辑 正如我试图解释的,这不是find正确的types,而是如何实例化正确的对象。

将generics应用于variables和函数 – Swift

我试图在swift中使用generics,以初始化Vector3D类中的variables。 然而,分配协议'数字'给我的variables(使其成为一个双或浮动),我得到以下错误: Protocol“Number”只能用作通用约束,因为它具有Self或相关types的要求 public protocol Number { func +(l: Self, r: Self) -> Self } extension Double : Number {} extension Float : Number {} class Vector3D: NSObject { var xCord: Number var yCord: Number var zCord: Number func Vector3D(x: [Number], y: [Number], z: [Number]) { self.xCord = x self.yCord = y self.zCord = z […]

用自定义运算符覆盖types转换

假设我有这样的事情: var x: Int = 6 var y: Float = 11.5 所以,结果必须这样写 var result = Float(x) * y 要么 var result = x * Int(y) 这是有道理的,对吗? 不过,我觉得有点笨拙,所以我正在尝试为此做一些自定义运算符: infix operator *~ { associativity left precedence 150 } //floating func *~ (lhs: Float, rhs: Int) -> Float { return lhs * Float(rhs) } func *~ (lhs: Int, […]

typesX不从Yinheritance

下面的Swift代码在最后一行产生这个错误: Type 'E' does not inherit from 'C<Self>' 。 不知道这里发生了什么事。 任何线索将不胜感激。 class C<T> {} protocol P { typealias E : C<Self> } class A : P { typealias E = C<A> } class S<U : P> {} class C2<T> : S<A> {} 更新:我简化了破碎的例子。 在这个问题的编辑历史中可以find旧版本(milos的答案提到)。

如何将types方法添加到Swift中的genericstypes?

我想在Swift中添加一个types(aka静态)方法到generics类。 这是代码。 class StateArchive<T> { class func emptyAllArchives() { // do something } } // the compiler emits an error: "Argument for generic parameter 'T' could not be inferred" StateArchive.emptyAllArchives() 我可以通过提供代替T的types来获得上面的代码来编译: StateArchive<AnyObject>.emptyAllArchives() 但是,这看起来很尴尬。 起初,我认为这样做的原因可能是可以创build一个types为T的类variables。在操场上的一个快速testing显示,编译器发出一条消息: “通用types尚不支持的类存储属性”。 有谁知道如何创build一个genericstypes的方法,并让客户端调用此方法,而不提供types的T代替?

在Swift中遍历视图控制器层次结构

我想遍历Swift中的视图控制器层次结构,并find一个特定的类。 这里是代码: extension UIViewController{ func traverseAndFindClass<T : UIViewController>() -> UIViewController?{ var parentController = self.parentViewController as? T? ^ | | // Error: Could not find a user-defined conversion from type 'UIViewController?' to type 'UIViewController' while(parentController != nil){ parentController = parentController!.parentViewController } return parentController } } 现在,我知道parentViewController属性返回一个可选的UIViewController,但我不知道如何在上帝的名字,我可以使通用一个可选的types。 也许使用某种where子句?

Swift:如何比较两个Dictionary <String,Any>结构体?

我正在使用在Swift中编写的使用typealias Context = [String: Any]来存储行的附加信息的Static框架。 现在,我需要比较两个Context结构在extension Row是否相等: public func ==(lhs: Row, rhs: Row) -> Bool { // TODO: image, … return lhs.text == rhs.text && lhs.detailText == rhs.detailText && lhs.accessory == rhs.accessory && lhs.context == rhs.context } 所以我实现了Row.Context的==运算符: public func ==(lhs: Row.Context, rhs: Row.Context) -> Bool { return Array(lhs.keys) == Array(rhs.keys) // TODO: && Array(lhs.values) […]

Swiftmultidimensional array

我正在研究一些使用generics的代码。 这是我想要实现的一个例子: var strings: Array<Array<String>> = [["1", "2", "3"], ["4", "5", "6"]] var array: Array<Array<AnyObject>> = strings 但是编译器说“'String'与'AnyObject'不一样”。 我不知道为什么编译器抱怨,以及如何实现我所需要的。 我已经试过像这样: var array: Array<Array<AnyObject>> = strings as Array<Array<AnyObject>> 没有任何成功。 你们有什么想法吗? 谢谢。

Swiftgenericstypes的属性和方法

如何将genericstypes存储在属性中,然后使用该types属性传入方法? 我有工厂的方法接收视图控制器types,但返回该视图控制器的实例(容器照顾)。 public protocol ViewControllerFactoryProtocol { func getViewController<T: UIViewController>(type: T.Type) -> UIViewController } public class ViewControllerFactory: ViewControllerFactoryProtocol { private let container: Container public init(container: Container) { self.container = container } public func getViewController<T: UIViewController>(type: T.Type) -> UIViewController { return self.container.resolve(type)! } } 我有这样的财产 var destinationViewController: UIViewController.Type { get } 现在我想要做一些事情: factory.getViewController(self.destinationViewController) 在那里我声明destinationViewController为LoginViewController.self 但它不是这样工作的。 奇怪的是,如果我直接这样做,它正在工作: factory.getViewController(LoginViewController.self) […]

检查一个数组是否包含Swift中另一个元素的所有元素

我想写一个数组的扩展来检查一个数组是否包含另一个数组的所有元素,在我的使用情况下它是string对象,但我一直得到: Cannot convert value of type 'T.Generator.Element' to expected argument type '@noescape _ throws -> Bool' 在行self.contains(item)关于item的错误 这里是我的代码: extension Array { func containsArray<T : SequenceType where T.Generator.Element : Equatable> (array:T) -> Bool{ for item:T.Generator.Element in array{ if !self.contains(item) { return false } } return true } }