iOS 应用程序在将协议拆分为多个协议并使用 typealias 组合它们时崩溃

iOS App Crashes when splitting out protocol into multiple protocols and combining them using typealias

提问人:Shawn Frank 提问时间:6/7/2023 最后编辑:Shawn Frank 更新时间:6/7/2023 访问量:48

问:

我有以下协议

protocol Three {
    var a1: Bool { get }
    var a2: Bool { get }
    var c1: Int { get }
    func test()
}

然后我有一个符合此协议的结构

struct ThreeTest: Three {
    var text: String
    
    init(_ text: String) {
        self.text = text
    }
}

// A
extension ThreeTest {
    var a1: Bool {
        return true
    }
    
    var a2: Bool {
        return true
    }
}

// B
extension ThreeTest {
    func test() {
        print("test")
    }
}

// C
extension ThreeTest {
    var c1: Int {
        return 10
    }
}

我是这样使用它的:

struct ViewModel {
    var three: Three
    
    init() {
        three = ThreeTest("hello")
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let vm = ViewModel()
        print("all good")
    }
}

这工作正常,并打印到控制台。all good

我接下来要做的是将协议拆分为多个协议,并使用typealias

protocol A {
    var a1: Bool { get }
    var a2: Bool { get }
}

protocol B {
    func test()
}

protocol C {
    var c1: Int { get }
}

typealias Three = A & B & C

如果您在测试应用程序中运行它,您会看到它编译并且运行良好,没有任何问题,但是,这完全相同的东西使我的应用程序崩溃Thread 1: EXC_BAD_ACCESS (code=2, address=0x102b7ff38)

虽然我知道您将无法为我的情况提供解决方案,因为您没有足够的信息并且无法复制

我的问题是,当您有一个协议时,在运行时后会发生什么不同,与将相同的需求拆分为多个协议并使用 typealias 组合多个协议?

iOS Swift Swift-Protocols 类型别名

评论

0赞 Shawn Frank 6/7/2023
@Sweeper - 这就是我提到的,这段代码本身运行良好,所以你将无法重现。我的问题是 - 使用一种协议与使用 typealis 组合多个协议时,在运行时会发生什么不同。
0赞 Sweeper 6/7/2023
从使用 godbolt.org(不带 -O 和带 -O)查看汇编输出差异,似乎使用交集类型的类型别名通常会占用更多内存。
0赞 Sweeper 6/7/2023
你也试过吗?这篇文章可能是相关的。protocol Three: A, B, C {}

答: 暂无答案