求问一个跟泛型协议相关的EXC_I386_GPFLT崩溃

[复制链接]
98 1
之前一直在Swift3下面开发一切正常。当代码升级到Swift3.3后,编译也通过,但是运行就产生了EXC_I386_GPFLT。逐步剥离到问题重现的最小代码模型,虽然解决了问题,但是还是很费解。发到这里来看看有没有高人给解惑根本原因。如果能从官方Swift3.3的更新说明里找到依据那就太好了。
PS:Swift不是鄙人的主力开发语言,ObjectC基本不懂。请高手鞭笞。

简单来说这个问题我感觉跟泛型协议和NSObject有关系。重现问题的最小代码如下。Swift3.3控制台工程,贴到main.swift里,直接运行就可以收获这个崩溃。

简单解决办法是
public func test1(stroke:K) where K:NSObjectLine
{ //触发条件4
替换为
public func test1(stroke:K) where K:AnyLine
{
这里求解为什么?以及是否有其他正解?



import Foundation

public protocol LineCutter {
associatedtype LP : GPoint //触发条件1
}

public class TLsCutter : LineCutter {
public typealias LP = TPoint
}

public protocol GPoint {

}

public struct TPoint : GPoint {
}

//----------------------------------------------------
public struct StructLine
where P : GPoint {

}

public class NSObjectLine
: NSObject where P : GPoint { //触发条件2

}

public class AnyLine
: Any where P : GPoint {

}
//----------------------------------------------------


public class Calculator where L:LineCutter, L.LP == P { //触发条件3

public init() {
}

public func test0(){
let all = NSObjectLine
()
print("(type(of:all))")
}

public func test1(stroke:K) where K:NSObjectLine
{ //触发条件4
//public func test1(stroke:K) where K:AnyLine
{
let x1 = ContiguousArray
()
print("(type(of:x1))")

//运行时报错 EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
let x2 = StructLine
()
print("(type(of:x2))")
}
}

let eqbc = Calculator()
eqbc.test0()
eqbc.test1(stroke: NSObjectLine())
//eqbc.test1(stroke: AnyLine())

举报 使用道具

回复

1 个评论

天山童姥  新手上路  发表于 2019-3-8 06:47:12  | 显示全部楼层
之前一直在Swift3下面开发一切正常。当代码升级到Swift3.3后,编译也通过,但是运行就产生了EXC_I386_GPFLT。逐步剥离到问题重现的最小代码模型,虽然解决了问题,但是还是很费解。发到这里来看看有没有高人给解惑根本原因。如果能从官方Swift3.3的更新说明里找到依据那就太好了。
PS:Swift不是鄙人的主力开发语言,ObjectC基本不懂。请高手鞭笞。

简单来说这个问题我感觉跟泛型协议和NSObject有关系。重现问题的最小代码如下。Swift3.3控制台工程,贴到main.swift里,直接运行就可以收获这个崩溃。

简单解决办法是
public func test1<K>(stroke:K) where K:NSObjectLine<P>{ //触发条件4
替换为
public func test1<K>(stroke:K) where K:AnyLine<P>{
这里求解为什么?以及是否有其他正解?



import Foundation

public protocol LineCutter {
    associatedtype LP : GPoint //触发条件1
}

public class TLsCutter : LineCutter {
    public typealias LP = TPoint
}

public protocol GPoint {
   
}

public struct TPoint : GPoint  {
}

//----------------------------------------------------
public struct StructLine<P> where P : GPoint {
   
}

public class NSObjectLine<P> : NSObject where P : GPoint { //触发条件2
   
}

public class AnyLine<P> : Any where P : GPoint {
   
}
//----------------------------------------------------


public class Calculator<P,L> where L:LineCutter, L.LP == P { //触发条件3
   
    public init() {
    }
   
    public func test0(){
        let all = NSObjectLine<P>()
        print("(type(of:all))")
    }
   
    public func test1<K>(stroke:K) where K:NSObjectLine<P>{ //触发条件4
    //public func test1<K>(stroke:K) where K:AnyLine<P>{
            let x1 = ContiguousArray<P>()
            print("(type(of:x1))")
            
            //运行时报错 EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
            let x2 = StructLine<P>()
            print("(type(of:x2))")
    }
}

let eqbc = Calculator<TPoint,TLsCutter>()
eqbc.test0()
eqbc.test1(stroke: NSObjectLine<TPoint>())
//eqbc.test1(stroke: AnyLine<TPoint>())

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

ios.irunthink.com
搜索
热搜: iOS swift 下拉刷新

图文热点

更多

开发教程

更多

客服中心

400-800 周一至周日 9:30-17:30 仅收市话费

关注我们

  • 微信扫描
  • 关注微信
关于我们
关于我们
友情链接
联系我们
帮助中心
精贴推荐
源码上传
注册登录
服务支持
资源下载
关注我们
官方微博
官方空间
快速回复 返回顶部 返回列表