小编mar*_*rux的帖子

Swift JSONEncoder 数字四舍五入

与所有 IEEE 7540 系统一样,Swift 中的数字 like4.7被视为类似的值4.7000000000000002。所以这并不奇怪:

% swift
Welcome to Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53).
Type :help for assistance.
  1> 4.7
$R0: Double = 4.7000000000000002
  2> 4.7 == 4.7000000000000002
$R1: Bool = true
Run Code Online (Sandbox Code Playgroud)

这是一个很好理解的世界现实,因此不需要通过包含指向浮点精度损失背景文章链接的评论来解决。

当使用内置的 编码这个数字时JSONEncoder,我们看到:

  4> String(data: JSONEncoder().encode([4.7]), encoding: .utf8) 
$R2: String? = "[4.7000000000000002]"
Run Code Online (Sandbox Code Playgroud)

这不是不正确,因为维基百科说有关JSON和浮点数:

JSON 标准对上溢、下溢、精度损失、舍入或带符号零等实现细节没有要求,但它确实建议期望不超过 IEEE 754 binary64 精度以实现“良好的互操作性”。将浮点数的机器级二进制表示(如 binary64)序列化为人类可读的十进制表示(如 JSON 中的数字)并返回时没有固有的精度损失,因为存在已发布的算法来准确地执行此操作和最佳。

但是,其他 JavaScript 环境倾向于对这些数字进行四舍五入。例如使用 JavaScriptCore:

% /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Helpers/jsc

>>> 4.7 == 4.7000000000000002
true
>>> JSON.stringify([4.7000000000000002])
[4.7]
Run Code Online (Sandbox Code Playgroud)

并与节点:

% …
Run Code Online (Sandbox Code Playgroud)

json swift

6
推荐指数
1
解决办法
908
查看次数

SwiftUI 按钮到选择器操作

我需要一个 SwiftUI 按钮在当前聚焦的组件上执行 Objective-C 选择器。以下作品:

\n\n
let button = Button(action: {\n  let command = #selector(NSStandardKeyBindingResponding.selectAll(_:))\n   NSApplication.shared.currentEvent?.window?.firstResponder?.doCommand(by: command)\n}, label: { Text("Select All") })\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6但这显然真的很难看。SwiftUI 有一个Command可以包装 a 的结构Selector,但尚不清楚创建命令后如何实际调用选择器。

\n\n

Command按下按钮时发出任意指令的推荐方法是什么?

\n

appkit swiftui

5
推荐指数
1
解决办法
1835
查看次数

如何实现类型擦除的通用包装器?

我需要实现我自己的结构类型擦除包装,非常相似SequenceOf,GeneratorOf等于是我开始试图通过刚刚重新实现标准的SequenceOf自己.

我只是复制并粘贴了声明SequenceOf,重命名为MySequenceOf,并填写了一些存根来获取:

/// A type-erased sequence.
///
/// Forwards operations to an arbitrary underlying sequence with the
/// same `Element` type, hiding the specifics of the underlying
/// sequence type.
///
/// See also: `GeneratorOf<T>`.
struct MySequenceOf<T> : SequenceType {

    /// Construct an instance whose `generate()` method forwards to
    /// `makeUnderlyingGenerator`
    init<G : GeneratorType where T == T>(_ makeUnderlyingGenerator: () -> G) {
        fatalError("implement me")
    }

    /// Construct an instance …
Run Code Online (Sandbox Code Playgroud)

generics swift

4
推荐指数
1
解决办法
1041
查看次数

NSToolbar中的下拉菜单,例如Mail.app

我想要一个带有附加的下拉菜单的工具栏按钮,例如Mail.app工具栏中的“标记”按钮:

来自Mail.app的标志菜单

我希望可以像这样正常制作NSMenuItem并添加菜单menuFormRepresentation,但是该菜单仅在按钮进入溢出模式时才会出现。

我还希望添加一个NSPopupButton作为自定义视图的视图可以起作用,但这会使整个视图成为菜单,而我希望组件的左侧部分像普通按钮一样工作,而右侧的下拉部分可以调出菜单。

是否有一些技巧可以使NSToolbarItem显示这样的组件,或者这两个自定义视图粘在一起?

cocoa appkit nstoolbar nspopupbutton

4
推荐指数
1
解决办法
442
查看次数

bash和zsh之间的单词向前/向后分隔符区别

被 macOS Catalina 拖入 21 世纪,现在默认为它的 shellzsh而不是bash它的 shell,我试图恢复一些 bash 的行编辑行为。具体来说,如果我在行尾:

bash$ ls /foo/bar/baz
Run Code Online (Sandbox Code Playgroud)

然后我按 Alt-左箭头键,光标跳到“baz”,然后是“bar”,然后是“foo”。与大多数环境(例如 Safari 和使用 Cocoa 文本编辑功能的应用程序)一样,它将斜杠视为单词分隔符。

zsh,当我尝试做同样的事情时,第一个 Alt-Left Arrow 将光标一直跳回到“/foo/bar/baz”的开头,这使得它对于直接编辑 long 的部分不太有用.

这可以在zsh中配置吗?如果是这样,如何?

bash zsh zsh-completion

4
推荐指数
1
解决办法
201
查看次数

隐藏 NSOutlineView 中组行的显示/隐藏按钮

我的 NSOutlineView 有一些组行无法折叠,类似于 Mail.app 无法隐藏“Mailboxes”组。我希望如果委托的shouldCollapseItem方法返回,则显示/隐藏悬停按钮将被禁用false,但情况似乎并非如此。

我尝试使用以下委托手动禁用它:

func outlineView(_ outlineView: NSOutlineView, willDisplayOutlineCell cell: Any, for tableColumn: NSTableColumn?, item: Any) {
    if outlineView.delegate?.outlineView?(outlineView, shouldCollapseItem: item) == false {
        if let view = outlineView.delegate?.outlineView?(outlineView, viewFor: tableColumn, item: item) {
            if let button = view.subviews.first(where: { $0.identifier == NSOutlineView.showHideButtonIdentifier }) {
                button.isHidden = true
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为返回的视图只是NSTableCellView将要呈现的视图,并且在调用此委托时它没有超级视图(因此我无法查找同级视图)。

我可以访问委托中的“显示/隐藏”按钮(这是一个未记录的NSOutlineButtonCell实例)makeView(withIdentifier:owner:),但此时我不知道它是否代表可以隐藏的组之一。

必须有一种方法可以做到这一点,因为 Mail.app(和其他应用程序)能够有条件地禁用组的显示/隐藏按钮。

macos nsoutlineview appkit swift

1
推荐指数
1
解决办法
764
查看次数