Tag: generics

Swift通用类作为委托

在swift中使用generics类作为委托时遇到了一个问题。 例如我试图使用通用的NSFetchedResultsDelegate定义为: class FetchedTableController<T:NSManagedObject> : NSFetchedResultsControllerDelegate 在课堂上,我设置了NSFetchedResultsController并将代理设置为“self”。 但由于某种原因,委托方法从未被调用过。 当我删除类的generics部分,委托按预期调用: class FetchedTableController : NSFetchedResultsControllerDelegate 有没有解决scheme使用generics类作为委托?

Swift – 无条件dynamic强制类?

似乎我不能将一个genericstypes转换为另一个genericstypes? Swift抛出DynamicCastClassException。 基本上是这样的问题: // T is defined as T: NSObject let oebj1 = NetworkResponse<User>() let oebj2 = oebj1 as NetworkResponse<NSObject> 这就是为什么我需要做这个铸造 class BaseViewController: UIViewController { // Not allowed to make a generic viewController and therefore have to cast the generic down to NSObject func fetchData(completion: (NetworkResponse<NSObject>)->()) { fatalError("You have to implement fetchData method") } } […]

崩溃nil可选

我做了一个新的操作符,只有当值不为零时才将值赋给一个目标,否则什么都不做。 基本上它是一个合成糖, if let foo = foo { faa = foo } : infix operator =? {} func =?<T>(inout lhs: T, rhs: T?) { if let rhs = rhs { lhs = rhs } } func =?<T>(inout lhs: T?, rhs: T?) { if let rhs = rhs { lhs = rhs } } 这样我可以保存一些input: // […]

EXC_BAD_ACCESS在Swift中使用generics

相关的问题: 在Swift中的通用完成处理程序 在我正在写的Swift应用程序中,我正在下载JSON,我想将其转换为模型对象。 现在,我正在这样做: func convertJSONData<T: Entity>(jsonData: NSData?, jsonKey: JSONKey, _: T.Type) -> [T]? { var entities = [T]() if let data = jsonData { // Left out error checking for brevity var json = JSON(data: data, options: nil, error: nil) var entitiesJSON = json[jsonKey.rawValue] for (index: String, subJson: JSON) in entitiesJSON { // Error: […]

如何将一个string的类名转换为类的types本身?

为了在日志文件中存储类名,我将类types的描述转换为string: let objectType: NSObject.Type = Object.self let str = String(describing: objectType) 但是,我没有成功地将str转换回types为NSObject.Type的variables,以便在generics方法中使用它。 我怎么能这样做?

在快速,可以一个函数是一个types?

在按Command + Click研究XCTAssert方法的同时,它看起来像是底层方法是一个具有types的函数(generics被称为T,符合Equatable协议)。 我是否正确地说,如果是这样,函数如何符合协议? 函数types是什么? public func XCTAssertEqual<T : Equatable>(_ expression1: @autoclosure () throws -> ArraySlice<T>, _ expression2: @autoclosure () throws -> ArraySlice<T>, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line) 这行是我想解释上面最混乱的: func XCTAssertEqual<T : Equatable>`

为什么不能使用界面生成器使用UIView的一个具体的通用子类?

首先要做的事情是……这已经被表决为closures为什么你不能直接在界面生成器中使用generics。 TLDR的答案是IB使用Objective-C和Objective-C不支持generics。 无论如何,无法指定generics的“专业”(即使用什么types)。 这是理解和完整的意义。 然而,这个问题是关于为什么你不能使用generics的一个子类,它完全定义了generics的专业,所以IB不需要知道任何关于generics的知识,甚至首先使用generics。 考虑以下课程… class MyView : UIView { } 我们可以很容易地在Interface Builder中使用这个类,方法是拖出一个视图,然后将其类types更改为MyView 。 实例化时,按预期方式调用MyView的init-with-coder。 现在考虑这些类… class MyGenericView<T> : UIView { } class MyView : MyGenericView<String> { } 在这种情况下,即使MyView基于MyGenericView<String> ,它本身基于UIView ,但不能在Interface Builder中使用此类。 但为什么? 这是一个完全合格的类,是UIView的子类,但是应用程序会警告它找不到指定的类。 值得注意的是,为了澄清我的问题,这是我的理解,这里MyView 不是一个generics。 它是一个完全定义的具体types,可以直接从它的类名实例化,最终基于NSObject(通过UIView),所以它似乎应该完全兼容Objective-C / IB,但似乎并不是这样的。 我试图理解为什么这是因为我的理解是, generics是一个编译器function,而不是一个运行时function,这意味着他们被编译到非generics对象,但我可能是错的。 所以…这是一个错误? 如果不是的话,是否有人能够清楚地知道为什么这个特定的场景不能按预期的那样工作,从技术angular度来看,我是否提到了编译器/运行时观察?

在Monotouch中,是否可以将通用列表保存到NSUserDefaults?

我在我的MonoTouch应用程序中有一个List<Hashtable> ,我需要将其保存到我的设置。 NSUserDefaults ,但是,只接受从NSObjectinheritance的东西。 有没有一种简单的方法来包装我的List中,我可以存储在我的设置,或者是一个快速通用的方式来编码和解码一个JSONstring(或类似)的Hashtable ? 还是有一个MonoTouch的替代品,坚持一个小的Hashtable ?

具有关联types需求和默认实现的Swift协议

很长一段时间,我一直在使用Swift协议和相关types进行非常艰苦的努力。 我重新开始了基本的真正了解什么是错误的,我遵循这篇文章的types擦除在相关types的要求,由罗布纳皮尔的Swift协议,但我仍然没有运气。 find下面的代码 // An Animal can eat protocol Animal { associatedtype Food func feed(food: Food) -> Void } struct AnyAnimal<Food>: Animal { private let _feed: (Food) -> Void init<Base: Animal where Food == Base.Food>(_ base: Base) { _feed = base.feed } func feed(food: Food) { _feed(food) } } // Kinds of Food struct Grass […]

Swiftgenerics在使用inheritance时不会实例化generics

我有classAlpha和Berry : class Alpha { } class Berry : Alpha { } 我有一个函数,在它的generics中使用inheritance: func myFunc<T : Alpha>(v:T) -> T { return T() } 我打电话给myFunc: myFunc(Berry()) 在我的项目中,返回的对象是Alphatypes,而不是Berrytypes。 这是编译器中的一个错误,或者这只是我误解generics的东西?