与所有 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) 我需要一个 SwiftUI 按钮在当前聚焦的组件上执行 Objective-C 选择器。以下作品:
\n\nlet 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
,但尚不清楚创建命令后如何实际调用选择器。
Command
按下按钮时发出任意指令的推荐方法是什么?
我需要实现我自己的结构类型擦除包装,非常相似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) 我想要一个带有附加的下拉菜单的工具栏按钮,例如Mail.app工具栏中的“标记”按钮:
我希望可以像这样正常制作NSMenuItem
并添加菜单menuFormRepresentation
,但是该菜单仅在按钮进入溢出模式时才会出现。
我还希望添加一个NSPopupButton
作为自定义视图的视图可以起作用,但这会使整个视图成为菜单,而我希望组件的左侧部分像普通按钮一样工作,而右侧的下拉部分可以调出菜单。
是否有一些技巧可以使NSToolbarItem显示这样的组件,或者这两个自定义视图粘在一起?
被 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中配置吗?如果是这样,如何?
我的 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(和其他应用程序)能够有条件地禁用组的显示/隐藏按钮。