如何修复 Swift Playground 中的“无法查找符号”错误

Posted

技术标签:

【中文标题】如何修复 Swift Playground 中的“无法查找符号”错误【英文标题】:How to fix 'Couldn't lookup symbols' error in Swift Playground 【发布时间】:2019-01-20 18:04:41 【问题描述】:

我有一个带有动态框架(称为“VisualKit”)的 Xcode 工作区和一个可以导入 VisualKit 的游乐场。

当 VisualKit 没有自己的外部依赖项时(即当 VisualKit 不依赖任何其他动态框架时),此设置可以正常工作。

但是,当我添加一个动态框架时(在这种情况下,我正在导入 SnapKit,尽管它是什么框架并不重要),我收到以下错误:

error: Couldn't lookup symbols:
  VisualKit.ItemsLabel.__allocating_init() -> VisualKit.ItemsLabel
  type metadata accessor for VisualKit.ItemsLabel

我尝试了以下方法: - 清理项目,删除导入语句,然后将其放回并尝试重建操场 - 删除派生数据 - 从头开始​​重新创建工作区/游乐场/框架项目

...一切都无济于事。

我的游乐场:

import UIKit
import PlaygroundSupport
import VisualKit

class MyViewController: UIViewController 
    override func loadView() 
        let view = UIView()
        view.backgroundColor = UIColor.red

        let label = ItemsLabel()
        label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
        label.text = "Hello"

        view.addSubview(label)
        self.view = view
    


PlaygroundPage.current.liveView = MyViewController()

ItemsLabel(在 VisualKit 动态框架项目中):

import UIKit
import SnapKit

public class ItemsLabel: UILabel 
    public init() 
        super.init(frame: .zero)
    

    required public init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

我希望 Playground 使用 SnapKit 导入(在 VisualKit 中)与没有导入时一样。

有什么想法吗?

【问题讨论】:

我遇到了类似的问题,看起来像这样。我通过在 Playground 中导入第二个框架来解决。在你的情况下,尝试在你的 Playground 文件中import SnapKit,关闭并重新打开 Xcode。 @ajeferson 有趣的想法。问题是我正在使用 Carthage 构建 SnapKit,并将构建的框架直接链接到 VisualKit 中。这意味着在我当前的设置中,SnapKit 对于要导入的操场实际上是不可见的。你有类似的设置吗?如果是这样,您是如何导入设置中的 SnapKit 的? 实际上,我使用的是 Cocoapods。我有两个我拥有代码的动态框架,我们称它们为框架 A 和 B。A 依赖于 B,这是使用 A 的 podspec 文件说明的。这种依赖导致在运行pod install 事件时安装 B,我认为我没有在我的项目的Podfile 上直接声明 B。但是,当我尝试在操场上导入 A 时,遇到了同样的错误。我找到的解决方案是添加B对项目Podfile的依赖,清理(我也删除了派生数据的目录,以防万一),关闭,重新打开并重建项目。 无论如何,我都无法通过将 SnapKit 导入我的 Playground 来解决问题。不过我很欣赏这个主意。 【参考方案1】:

经过数小时的艰苦排查,我设法解决了这个问题:

    在 Xcode 中,在项目导航器中选择您的框架项目。

    导航到Build Phases 标签。

    添加Copy Files 阶段(通过点击+ 按钮),然后从下拉选择器中选择Frameworks

    将框架中使用的所有 carthage 框架添加到复制文件阶段。

然后清理并重建您的框架,并且 Playground 现在应该可以按照您的预期工作了。

请注意,此答案仅在您使用 Carthage 构建框架项目中使用的 3rd 方框架时才一定适用。

【讨论】:

您没有准备好/usr/local/bin/carthage copy-frameworks 脚本吗?

以上是关于如何修复 Swift Playground 中的“无法查找符号”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 3 Playground 读取 Resources 目录中的文本文件?

如何在 Playground 中导入 Swift 包?

Swift 中的 Playground 不会使用 Firebase

遍历数组只获得 Swift Playground 中的第一个值

如何检查 Playground 的 swift 版本?

将图像添加到 swift Playground [iPad]