Swift 5 LLDB错误:警告:<EXPR>:12:9:警告:从未使用变量'$ __ lldb_error_result'的初始化

and*_*der 9 generics dictionary uitableview lldb swift

完整的错误消息:

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(
    ^~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

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

更多详情...

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

class TVCDataSource_List<T: Managed, etc...>
Run Code Online (Sandbox Code Playgroud)

该通用TVC包括一个词典,该词典旨在容纳TVC的部分标题的较长“替代”名称的列表。

var dictionarySectionData: [String: String] = [:]
Run Code Online (Sandbox Code Playgroud)

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

我曾尝试在代码中的许多不同位置填充此词典,其中大多数都可以工作,但都具有相同的结果,特别是:

  • 我使用调试器逐步执行代码,并按预期方式,通过对持久性存储的单个提取请求填充字典。
  • 紧接着,调用print(dictionarySectionData.description)控制台会按预期打印出正确填充的字典;
  • 在控制台之前和之后立即使用p dictionarySectionData(或po)询问LLDB print,产生在该问题开始时详细说明的“完全错误消息”;
  • 同时,助理编辑器变量查看器显示字典为空,这与打印令人惊讶地冲突。
  • 我继续逐步完成代码以构造TVC,因为字典不再具有其键值对,我无法调出我的节头的值,并且按预期,控制台报告“致命错误:在展开Optional时意外发现nil值”。

我做了一些简单的研究:

  1. Scott Berrevoets撰写的此博客标题为“重新绑定自身:调试器的中断点”。
  2. Keith Smiley撰写的这份Swift Bug报告标题为“ LLDB:警告:变量'$ __ lldb_error_result'的初始化”。
  3. Zev Eisenberg的这份Swift Bug报告标题为“错误:在NSAttributedString扩展中使用未声明的类型'$ __ lldb_context'”。

看来我可能有:

  • 偶然发现编译器中的错误;要么
  • 试图在通用TVC中设置字典的值,以便编译器解释重新绑定到self的尝试?

坦率地说,我都不了解,也不了解我对编译器和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
    }
}
Run Code Online (Sandbox Code Playgroud)

导致错误消息的代码有两个...

A.如上 func createDictionaryOfSectionHeaderText()

let stringSortOrder = String(type.sortOrder)
let formatSortOrder = String(format: "%02d", stringSortOrder)
Run Code Online (Sandbox Code Playgroud)

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

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

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

stringHeaderText = dictionarySectionData[stringSectionName]!
// "Fatal error: Unexpectedly found nil while unwrapping an Optional value"
Run Code Online (Sandbox Code Playgroud)

...经过进一步思考之后,当显式展开Optional时(如Optional为nil时),这完全符合预期!

因此,当我stringHeaderText通过移除指令来显式地解开设置器以将其更改为,而在nil时提供默认值时,我的编程问题就消失了。

stringHeaderText = dictionarySectionData[stringSectionName] ?? "ERROR"
Run Code Online (Sandbox Code Playgroud)

如果/我更了解这一点,我什至可以提供答案。

Skw*_*ggs -2

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

  • 这不是问题的答案! (2认同)