Swift 5 LLDB 错误:警告:<EXPR>:12:9:警告:变量“$__lldb_error_result”的初始化从未使用过

Posted

技术标签:

【中文标题】Swift 5 LLDB 错误:警告:<EXPR>:12:9:警告:变量“$__lldb_error_result”的初始化从未使用过【英文标题】:Swift 5 LLDB error: warning: <EXPR>:12:9: warning: initialization of variable '$__lldb_error_result' was never used 【发布时间】:2019-09-05 04:31:58 【问题描述】:

完整的错误信息:

error: warning: <EXPR>:12:9: warning: initialization of variable '$__lldb_error_result' was never used; consider replacing with assignment to '_' or removing it
    var $__lldb_error_result = __lldb_tmp_error
    ~~~~^~~~~~~~~~~~~~~~~~~~
    _

error: <EXPR>:19:5: error: use of unresolved identifier '$__lldb_injected_self'
    $__lldb_injected_self.$__lldb_wrapped_expr_7(
    ^~~~~~~~~~~~~~~~~~~~~

当我在通用 UITableViewController (TVC) 中查询 Dictionary&lt;String, String&gt; 属性的值时,此错误出现在控制台中。

更多细节...

我有一个通用 TVC(如上所述),它或多或少基于 Florian Kugler 和 Daniel Eggert 的“核心数据”一书中概述的框架,除其他外,它采用 T 的通用值。

class TVCDataSource_List<T: Managed, etc...>

此通用 TVC 包含一个字典,旨在保存 TVC 部分标题的较长“替代”名称列表。

var dictionarySectionData: [String: String] = [:]

我选择以这种方式对 TVC 进行编程,因为在数据模型属性(部分标识符)中将名称的引用作为两个短字符 String 比将长名称作为 @987654330 来保存似乎更有效@。

我尝试在代码中的许多不同位置填充这本字典,其中大部分都有效,但结果都相同,特别是:

我使用调试器单步执行代码,正如预期的那样,字典是通过对持久存储的单个提取请求填充的; 紧接着,对控制台的print(dictionarySectionData.description) 调用会按预期打印出正确填充的字典; 在此print 之前和之后立即使用p dictionarySectionData(或po)向控制台询问LLDB,会产生此问题开头处详述的完整错误消息; 同时,Assistant Editor Variable Viewer显示字典为空,与打印出奇的冲突; 我继续单步执行代码来构造 TVC,因为字典不再有其键值对,我无法回忆我的部分标题的值,并且正如预期的那样,控制台报告“致命错误:意外发现 nil 而展开可选值”。

我做了一些简单的研究:

    这个 Blog 由 Scott Berrevoets 撰写,标题为“重新绑定自我:调试器的断点”。 Keith Smiley 的 Swift Bug Report 标题为“LLDB:警告:变量‘$__lldb_error_result’的初始化”。 Zev Eisenberg 的 Swift Bug Report 标题为“错误:在 NSAttributedString 扩展中使用未声明的类型 '$__lldb_context'”。

看来我可能有:

偶然发现编译器中的一个错误;或 试图在通用 TVC 中设置字典的值,以便编译器解释重新绑定到自身的尝试??

坦率地说,根据我对编译器和 Swift 的浅薄知识,我都无法理解这两种方法,这将花费我数月甚至数年的学习和经验。我很高兴随着时间的推移慢慢积累。

我确实有一个令人满意的解决方案...而不是在 TVC 生命周期开始时为 TVC 的部分标题构建一个较长的“替代”名称字典,而是在每次代码解析名称时运行一个获取请求当前的 TVC 部分标题。这可以完美运行并且不会阻塞 UI(目前)。

但是,我不能在开始构建通用 TVC 时运行一次提取来为 TVC 的部分标题准备一个包含较长“替代”名称的简明字典,而是必须为每个部分运行一次提取,这让我非常恼火用户决定滚动浏览的部分。执行一次提取并在内存中保存 12-15 个键值对的字典似乎比运行多次提取更有效。

有人遇到过这个问题吗?

如果是这样,您能提供任何建议吗?


更新

问题似乎在于我对明确解包的Optional 的使用——或者更准确地说,是我的误用。

这是我用来填充字典的代码...

func createDictionaryOfSectionHeaderText() 

    let request = Types.preparedFetchRequest
    // noting .preparedFetchRequest is a static var, available through generics

    let key = "typeParent.typeParentName"
    let name = "Taxonomy"
    let predicate = NSPredicate(format: "%K == %@", argumentArray: [key, name])

    request.predicate = predicate

    var results: [Types] = []

    do 

        results = try <<My NSManagedObjectContext>>.fetch(request)
    
    catch 

        let fetchError = error
        print(fetchError)
    

    for type in results 

        let formatSortOrder = String(format: "%02d", type.sortOrder)
        dictionarySectionData[formatSortOrder] = type.typeName
    

有两个代码元素导致了错误消息...

A.如上func createDictionaryOfSectionHeaderText()

let stringSortOrder = String(type.sortOrder)
let formatSortOrder = String(format: "%02d", stringSortOrder)

...正在将字符串输入格式“%02d”,不确定效果...待定。

(现在从这两行更改为单行 let formatSortOrder = String(format: "%02d", type.sortOrder) - 当然可以。)

B.在UITableViewDelegate 方法内func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -&gt; UIView?

stringHeaderText = dictionarySectionData[stringSectionName]!
// "Fatal error: Unexpectedly found nil while unwrapping an Optional value"

...经过对此事的更多思考,当显式打开 Optional 时,当 Optional 为 nil 时,这与预期的完全一样!!

因此,当我通过删除显式解包指令将 setter 更改为 stringHeaderText 并在 nil 时提供默认值时,我的编程问题就消失了。

stringHeaderText = dictionarySectionData[stringSectionName] ?? "ERROR"

如果/当我更好地理解这一点时,我什至可以提供答案。

【问题讨论】:

是的,几乎每个po 都会打印出这条消息。在 Xcode 中进行调试总是困难而缓慢,而且每年都会变得更糟。他们得到了一个新关键字v,但这完全没用,因为很多变量都不可用。我讨厌 Xcode :( 与 IntelliJ 相比,Xcode 真的非常糟糕。 @J.Doe 技术说明 - 这与 Xcode 无关,而是与 LLVM 调试器有关。 您能否添加更多与泛型类相关的代码?也许dynamicNSManaged 的一些错误用法可能是问题所在? @Sulthan 感谢您的评论......当然我可以包含代码,但它会是一个非常大的块,至少需要三个类才能在上下文中呈现。所有实体属性都正常运行并使用我提到的项目构建和运行的“令人满意的解决方案”,所以除非我遗漏了什么,我相当肯定它与NSManagedObject 子类/es 无关。 PS 用 Swift 编写,所以不要使用 dynamic 【参考方案1】:

这些问题应该在 XCode 12 中得到解决。 XCode 10 和 11 中确实存在很多错误,尤其是在泛型方面

【讨论】:

这不是问题的答案!

以上是关于Swift 5 LLDB 错误:警告:<EXPR>:12:9:警告:变量“$__lldb_error_result”的初始化从未使用过的主要内容,如果未能解决你的问题,请参考以下文章

快速在 LLDB 中使用 po

SWIFT 致命错误:在展开可选值 (lldb) 时意外发现 nil

swift:致命错误:在展开可选值(lldb)时意外发现 nil,线程 1

Swift Playground 中的空类给出 __lldb_expr_ 错误

Swift之深入解析如何将代码添加为自定义LLDB命令

LLDB (Swift):将原始地址转换为可用类型