如何从 OSX Swift 命令行工具或 shebang 脚本文件显示窗口?

l -*_*c l 5 macos shebang swift

如何从 OSX Swift 命令行工具或 shebang 脚本文件显示窗口?

理想情况下,不使用其他文件。没有故事板。没有西布。

一个示例是具有单个 Swift 文件的 OS X 命令行工具 Xcode 项目。

import Cocoa // AppKit, CoreData, Foundation

let arguments = Process.arguments 

if (arguments.contains("usegui")) {
    // show arguments in a window with text field and dismiss button
    // GIVEN: some NSWindow
    let aTextField = NSTextField(frame: NSMakeRect(25, 320, 180, 24))
    aTextField.stringValue = arguments.description
    let mask = NSTitledWindowMask | NSClosableWindowMask
    let aWindow = NSWindow(
        contentRect: NSMakeRect(0, 0, 400, 210), 
        styleMask: mask, 
        backing: NSBackingStoreType.Buffered, 
        `defer`: false)
    aWindow.contentView!.addSubview(aTextField)
    // add button ... 

    /* How to 
    * (a) present the window? 
    * (b) have window dismissed by user?
    */

} else {
    print("Using text IO here.")
    print(arguments)
}
Run Code Online (Sandbox Code Playgroud)

另一个例子是 shebang Swift 脚本。

#!/usr/bin/swift
import Cocoa // AppKit, CoreData, Foundation

let arguments = Process.arguments 

if (arguments.contains("usegui")) {
    // popup window showing arguments here
} else {
    print(arguments)
}
Run Code Online (Sandbox Code Playgroud)

背景:应用程序上下文中存在大量快速窗口示例。并且,许多使用文本 I/O 的 Swift REPL 示例。

是否有合理的方法从 swift CLI 工具或 swift 脚本弹出信息窗口或请求窗口?

l -*_*c l 1

我还没有找到问题所提出的解决方案。设置窗口并处理用户界面事件并非易事。

Apple 在开放脚本架构扩展 (OSAX)中提供了一组常见的用户交互(例如对话框和警报)。Process()Swift 可以使用设置为“/usr/bin/osascript”来调用 OSAX 例程launchPath

let process = Process()
process.launchPath = "/usr/bin/osascript"
process.arguments = args // Applescript
// ... more code here ...
Run Code Online (Sandbox Code Playgroud)

因此,我最终创建了一个名为 的框架MCxSystemExecOsax,它提供了一组围绕许多开放脚本架构扩展 (OSAX) 用户交互功能的 Swift 包装器。还包括一个通用的运行 unix 脚本。有关详细信息,请参阅MCxSystemExecOsaxGitHub。

如果存在类似于 OSAX 的跨平台用户交互库,那将非常有趣。例如,这样的库很可能使用Swift + Gnome Toolkit (GTK+)来实现。