首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速编译错误分割故障11 -泛型符合协议

快速编译错误分割故障11 -泛型符合协议
EN

Stack Overflow用户
提问于 2015-08-06 18:41:36
回答 1查看 1K关注 0票数 4

SWIFT1.2/ XCode 6.4

我有以下代码:

代码语言:javascript
复制
public protocol MapShape : AnyObject
{
    func isEqualTo(other : MapShape) -> Bool
}

还有一个通用类,我试着遵守这个协议

代码语言:javascript
复制
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 //simplify code
    }


extension MapMulti : MapShape {
    public func isEqualTo(other: MapShape) -> Bool {
        if (object_getClassName(other) == object_getClassName(self))
        {
            return self == other as! MapMulti
        }
        return false
     }
}

当我尝试构建失败时,我会用:

代码语言:javascript
复制
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

导致故障的部分是试图遵循MapShape协议的扩展,如果我将它编译掉的话。

另外,我认为我的概括性理解是错误的。当我尝试这个的时候:

代码语言:javascript
复制
let multipoint : MapMulti<MapShape> = MapMulti<MapPoint>(items: [P1,P2,P3])

它说MapMulti(MapPoint)不能转换为MapMulti(MapShape)

即使MapPoint符合MapShape,我也可以这样做:

代码语言:javascript
复制
let shape : MapShape = MapPoint()

相反,我不得不这样做:我不喜欢。

代码语言:javascript
复制
let multiShape : MapMulti<MapShape> = MapMulti<MapShape>(items: [P1,P2,P3])

拜托,需要帮助!

编辑:添加了MapPoint实现

代码语言:javascript
复制
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
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-08-09 03:07:00

我对您的代码做了一些小小的修改,现在它已经编译了。

代码语言:javascript
复制
public protocol MapShape // Removed the : AnyObject
{
    func isEqualTo(other : MapShape) -> Bool
}

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 //simplify code
}

现在,如果您只想知道这两个元素是否是同一个类的实例,那么下一个更改就可以了:

代码语言:javascript
复制
extension MapMulti : MapShape {
    public func isEqualTo(other: MapShape) -> Bool {
        // You can compare against dynamic class here 
        return self.dynamicType == other.dynamicType
    }
}

在这个问题中有一个非常好的解释和dynamicType的例子:Identifying a subclass with Swift Generics works with custom class but not with UITapGestureRecognizer

我希望这能帮上忙

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31863462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档