如何修复 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 目录中的文本文件?
Swift 中的 Playground 不会使用 Firebase