Tag: generics

Swiftgenerics和向上转换

在Swift中,我有一个关于generics的简单问题。 问题是我试图存储一个variables,需要generics作为参数,但无法将其强制转换为受限制的types。 最好用一个简短的例子来解释: class Foo { } class Thing<T: Foo> { func produceBar() -> Bar { return Bar(aThing: self as! Thing<Foo>) } } class Bar { var thing: Thing<Foo> init(var aThing: Thing<Foo>) { self.thing = aThing } } 上面的代码产生错误: "Cast from Thing<T> to unrelated type Thing<Foo> always fails" 不应该永远不会失败,因为T被限制为Foo的一个子类? 我必须误解Swift中的generics工作方式,任何指导或帮助将不胜感激!

无法将类实例分配给其协议types?

请参阅下面的例子。 编译器在最后一行报告错误(由COMPILE ERROR标记),我将SimpleTrain一个实例分配给一个协议types(按我的最佳判断)符合。 我怎样才能编译? 我究竟做错了什么? 或者是这个编译器问题? protocol Train { typealias CarriageType func addCarriage(carriage: CarriageType) func shortTrain<ShortType: Train where ShortType.CarriageType == CarriageType>() -> ShortType } class SimpleTrain<T> : Train { typealias CarriageType = T private var carriages: [T] = [T]() func addCarriage(carriage: T) { carriages.append(carriage) } func shortTrain<ShortType: Train where ShortType.CarriageType == CarriageType>() -> ShortType { […]

仅用于数字types的genericstypes约束

我想弄清楚如何实现genericstypes(在Swift中)的types约束,将genericstypes仅限于数字types。 比如Double,Int等,而不是string。 谢谢你的帮助。

我怎样才能找出Objective-C的genericstypes?

Xcode 7包含一个Objective-C变体,您可以在其中为(同源的) NSArray返回值和属性(如NSArray<UIImage*> )定义types提示。 我想使用这个function来重写我的JSON反序列化器类(它需要这种types的提示 – 以前我已经通过添加一个-(Class)jsonHintForKey:(NSString*)key来解决这个问题,我的类有同质arrays作为属性)。 你知道是否(如果是这样,如何)我可以使用Objective-C运行时在运行时获得这个新types提示的类?

Swift框架不包括通用结构扩展的符号

我无法链接我的框架与利用该框架的代码。 具体而言,链接程序无法findgenerics结构的扩展符号。 这是可选的扩展之一: extension Optional { /// Unwrap the value returning 'defaultValue' if the value is currently nil func or(defaultValue: T) -> T { switch(self) { case .None: return defaultValue case .Some(let value): return value } } } 如果在应用程序的主要部分编译代码,此方法在游乐场或应用程序中效果很好。 但是,当我尝试将其编译为框架时,应用程序(甚至框架的testing)产生以下链接器错误: 架构i386的未定义符号:“__TFSq2orU__fGSqQ__FQQ”,引用来自:__TFC18SwiftPlusPlusTests27Optional_SwiftPlusPlusTests13testOrWithNilfS0_FT_T_可选+ SwiftPlusPlusTests.o 类似的方法,如下面的,链接罚款(注意,它不是一个通用的) extension String { /// Returns a string by repeating it 'times' times […]

Swift 2.0中使用故事板的通用控制器

我试图为我的应用程序创build一个GenericListController。 我有一个ProductListController扩展这个扩展UIViewController的通用控制器。 我已经将ProductListController连接到一个故事板并创build了2个sockets,但是我总是收到这个错误: Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x7c158ca0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchBar.' 我收到所有我的网点这个错误,如果我从GenericListController中删除genericsT它的作品。 我想故事板不能加载generics的超级。 我怎样才能使它工作? 我的代码: class GenericListController<T> : UIViewController { var list : [T] = [T]() var filteredlist : [T] = [T]() func getData(tableView : UITableView) { ….. } func setData(list […]

扩展中的Swift覆盖函数

如果我有一个class级: class Spaceship<FuelType> { function prepareForLiftoff() throws { //Start the countdown! } } 我原本以为我可以通过添加一个扩展来覆盖prepareForLiftoff而无需子类: extension Spaceship where FuelType: CollectionType { func prepareForLiftoff() throws {} } 这个代码虽然没有编译,但是错误表示函数invalid redeclaration ,这是有道理的。 我的问题是:是否有重写某个特定类的函数? 换句话说,我可以在某些情况下replacefunction,例如FuelType: CollectionType 。 如果没有,是否有任何其他解决方法或方式来实现这种行为(也许宣布另一个协议,IDK) 现在我想了解更多,我不得不说这是不可能的,因为阻止某人重写任何标准库函数是什么原因?

可选绑定成功,如果不应该

这是我作为Swift中的遍历视图控制器层次结构 (略有修改)的可能解决scheme发布的内容: extension UIViewController { func traverseAndFindClass<T where T : UIViewController>(T.Type) -> T? { var currentVC = self while let parentVC = currentVC.parentViewController { println("comparing \(parentVC) to \(T.description())") if let result = parentVC as? T { // (XXX) return result } currentVC = parentVC } return nil } } 该方法应该遍历父视图控制器层次结构并返回给定类的第一个实例,如果没有find,则返回nil。 但它不起作用,我不明白为什么。 用(XXX)标记的可选绑定总是成功 ,因此即使不是T的实例,也会返回第一个父视图控制器。 这可以很容易地被复制:从Xcode 6 […]

如何使集合types约束generics?

我一直试图从string数组中提取非零值。 像下面一样。 但是,我的老大也希望能够从其他types中提取非零值 。 我看过, generics可以帮助我处理不同的types。 我怎样才能使用generics,以便我可以使用像扩展一样使用其他types? getNonNil必须返回提取的非零值的特定types(即如果数组是[string?]它必须返回[string],返回[INT]如果[INT?] ) 因为我必须做进一步的计算。 我所尝试的是如下: import Foundation // Extended the collection-type so that collectiontype is constrained to having element with optional strings extension CollectionType where Self.Generator.Element == Optional<String>{ func getNonNil() -> [String] { // filter out all nil elements and forcefully unwrap them using map return self.filter({$0 != nil}).map({$0!}) […]

将一个types传递给一个通用的Swift扩展,或者理想地推断它

说你有 class Fancy:UIView 你想find所有兄弟Fancy意见。 没问题 … for v:UIView in superview!.subviews { if let f = v as? Fancy { f.hungry = false } } 所以,试试扩展名, public extension UIView { internal func fancySiblings()->([Fancy]) { return (self.superview! .subviews .filter { $0 != self } .flatMap { $0 as? Fancy } ) } } 真棒,你现在可以 for f:Fancy in […]