Swift 1.2 / Xcode 6.4
I have the following code:
public protocol MapShape : AnyObject { func isEqualTo(other : MapShape) -> Bool }
And the general class that I am trying to execute with this protocol
public class MapMulti<T:MapShape> { let items : [T] init(items : [T]) { self.items = items } } extension MapMulti : Equatable {} public func ==<T:MapShape>(lhs: MapMulti<T>, rhs: MapMulti<T>) -> Bool { return true
When I try to build unsuccessfully with:
0 swift 0x000000010a3da2b8 llvm::sys::PrintStackTrace(__sFILE*) + 40 1 swift 0x000000010a3da794 SignalHandler(int) + 452 2 libsystem_platform.dylib 0x00007fff95704f1a _sigtramp + 26 3 libsystem_platform.dylib 0x00007fff55f3c832 _sigtramp + 3229841714 4 swift 0x0000000109d0112b swift::irgen::emitCategoryData(swift::irgen::IRGenModule&, swift::ExtensionDecl*) + 1819 5 swift 0x0000000109d09432 swift::irgen::IRGenModule::emitExtension(swift::ExtensionDecl*) + 514 6 swift 0x0000000109d061a4 swift::irgen::IRGenModule::emitSourceFile(swift::SourceFile&, unsigned int) + 100 7 swift 0x0000000109d87c77 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 2151 8 swift 0x0000000109d88693 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51 9 swift 0x0000000109cc4087 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 6647 10 swift 0x0000000109cc24e6 main + 1814 11 libdyld.dylib 0x00007fff998e75c9 start + 1 12 libdyld.dylib 0x0000000000000069 start + 1718717089 Stack dump: 1. While emitting IR for source file /<PROJECT>/MyProject/MapMulti.swift
The failure part is an extension that tries to conform to the MapShape protocol if I comment on its compilation.
I also think that something in my understanding of Generics is wrong. When I tried this:
let multipoint : MapMulti<MapShape> = MapMulti<MapPoint>(items: [P1,P2,P3])
It says that MapMulti (MapPoint) does not convert to MapMulti (MapShape)
Although MapPoint complies with MapShape, I can:
let shape : MapShape = MapPoint()
Instead, I have to do: what I don't like.
let multiShape : MapMulti<MapShape> = MapMulti<MapShape>(items: [P1,P2,P3])
Please need help !!!
Edit: MapPoint implementation added
public class MapPoint : MapShape{ let lat : Double let long : Double init (lat : Double, long : Double) { self.lat = lat self.long = long } } extension MapPoint : Equatable{} public func ==(lhs: MapPoint, rhs: MapPoint) -> Bool { return lhs.long == rhs.long && lhs.lat == rhs.lat } extension MapPoint : MapShape { public func isEqualTo(other: MapShape) -> Bool { if (object_getClassName(other) == object_getClassName(self)) { return self == other as! MapPoint } return false } }