Tag: generics

如何实现一个具有通用约束types属性的Swift协议?

我想有一个看起来像这样的协议: protocol ReturnType { var returnType: ImmutableMappable.Type { get } } 执行协议的枚举部分: extension ShimEndPoint: ReturnType { var returnType: ImmutableMappable.Type { switch self { case .deAuthorize(_, _): return EmptyResponse.self case .authorize(_, _): return AuthorizeResponse.self case .step(_, _, _, _): return StepResponse.self } } } EmptyResponse,AuthorizeResponse和StepResponse都实现ImmutableMappable。 现在我想在函数调用中使用“returnType”属性: return Shim.provider .request(endPoint) .timeout(7, scheduler: MainScheduler.asyncInstance) .retry(3) .mapObject(endPoint.returnType) line mapObject给了我下面的编译器错误:“不能将types'ImmutableMappable.Type'的值转换为期望的参数types'T.Type' […]

Swift:将genericstypes转换为相同的genericstypes,但使用相关types的子类

考虑这些类: struct OrderedSet<T: Hashable> {} class Exercise: Hashable {} class StrengthExercise: Exercise {} class CardioExercise: Exercise {} 我想要做以下事情: var displayedExercises = OrderedSet<Exercise>() { didSet { self.tableView.reloadData() } } var cardioExercises = OrderedSet<CardioExercise>() var strengthExercises = OrderedSet<StrengthExercise>() @IBAction func segmentControlChanged(segmentControl: UISegmentedControl) { switch segmentControl.selectedSegmentIndex { case 0: self.displayedExercises = self.strengthExercises case 1: self.displayedExercises = self.cardioExercises default: […]

如何定义在Swift中的闭包数组?

我想要这样定义: public var reloadFRCsNeedToPerformWhenFail = [()->()]() 但是我得到一个错误

是否有可能在Swift中创build一个通用的闭包?

func myfunc<T>(i:T) -> T { return i } 是否有可能使这个通用函数闭包? let myfunc = { <T>(i:T) -> T in return i } 这不起作用…

Swift中的generics – “通用参数”T“无法推断

我想从一个方法返回符合MyProtocol的UIViewController ,所以我使用方法签名: func myMethod<T where T : UIViewController, T : MyProtocol>() -> T { 首先,我不明白:如果myMethod返回例如一个MyViewController必须签名,我必须强制转换它: class MyViewController: UIViewController, MyProtocol 我不能简单地return MyViewController()但我需要像这样return MyViewController() as! T : return MyViewController() as! T return MyViewController() as! T – 为什么这是必要的? 第二件事:我怎样才能在某个地方使用这个方法? 我不能简单地说 let x = myMethod() as? UIViewController 因为我得到的错误 Generic parameter 'T' could not be inferred 我怎么能做到这样的事情? 如果我把它投到MyViewController它的作品,但我想避免,当然。 编辑:例子 class […]

Swift:如何从函数返回类的types

我知道有可能将类types传递给swift中的函数: func setGeneric<T>(type: T.Type){ } setGeneric(Int.self) 但是,我们如何从函数返回types? 写一些像 func getGeneric<T>() -> T.Type { return Int.self } 给编译器错误“Int与T不相同”。 那么是否有可能从一个快速函数返回types? 编辑 一些解释。 我有用于持久性的类(我正在使用Realm),我有类作为这个类的包装。 所有的包装器都从RealmClassWrapperinheritance,它需要知道它实际包装的Realm类。 所以,让我们说我有这个领域模型: class RealmTodo: RLMObject { dynamic var title = "" } 和我的包装晚餐类看起来像这样: class RealmClassWrapper { private let backingModel: RLMObject //… func backingModelType<T>() -> T.Type{ fatalError("must be implemented") } } 和实际的包装: class Todo: RealmClassWrapper […]

调用函数时明确指定generics约束

我想知道是否有可能在Swift中明确指定generics函数的genericstypes。 假设我有下面的函数定义,它基本上创build了一个genericstypesT的空数组: func bar<T>() -> [T] { return [T]() } 我怎么能打电话呢? var foo = bar() 结果是 通用参数“T”无法推断 这是完全有道理的,因为在这里真的没有任何信息来推断任何东西。 但不幸的是,我试图通过以下方式明确指定types约束失败: var foo = bar<Int>() 错误:不能明确地专门化一个通用函数 为什么我无法做到这一点? 这是一个语言规范,不能明确指定generics? 用什么方法来指定函数的generics?

genericstypes约束与inheritance

这两个函数声明有没有区别? func doSomething<T: UIViewController>(controller: T) {…} 与 func doSomething(controller: UIViewController) {…} 在Apples Swift编程语言书的types约束语法部分,有这样的代码示例: func​ ​someFunction​<​T​: ​SomeClass​, ​U​: ​SomeProtocol​>(​someT​: ​T​, ​someU​: ​U​) { // function body goes here } 与此描述: 上面的假设函数有两个types参数。 第一个types参数T有一个types约束,它要求T是SomeClass的子类。 … 那么在哪种情况下最好使用上面描述的通用函数呢?

Swift通用variables

我有一个协议,我想有一个types的UIViewController实现mu协议的variables。 如果我尝试做类似的事情: var delegate:UIViewController<BouncingMenuDelegate>? 我收到UIViewController是一个非genericstypes的错误。 那么问题是如何访问Objective-C中用于访问委托的模型? 先谢谢你!

自定义运算符来简化If-Let

我想简化一直需要做的事情 if let firstName = firstName { self.name = firstName } 一个可能的习惯,通用的操作符来做到这一点 infix operator ?= {} func ?= <T>(inout left: T, right: T?) { if let right = right { left = right } } 简化前面的例子 self.name ?= firstName 这会产生一个问题,如果firstName的值是零 ,那么Swift会把值包装在一个可选项中。 var name: String? = "Bob" var firstName: String? = nil self.name ?= firstName print(self.name) […]