对于那些需要在Swift 5.7中完成工作的简化代码片段的人来说,它只是起作用的(基于@Devarshi的代码)。
func watch(using closure: @escaping (_ copiedString: String) -> Void) {
let pasteboard = NSPasteboard.general
var changeCount = NSPasteboard.general.changeCount
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
guard let copiedString = pasteboard.string(forType: .string),
pasteboard.changeCount != changeCount else { return }
defer {
changeCount = pasteboard.changeCount
}
closure(copiedString)
}
}
如何使用如下所示:
watch {
print("detected : \($0)")
}
然后,如果你尝试复制粘贴板中的任何文本,它将会监视并打印到控制台上,如下所示...
detected : your copied message in pasteboard
detected : your copied message in pasteboard
如果需要,在SwiftUI中使用它的完整代码示例:
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onAppear {
watch {
print("detect : \($0)")
}
}
}
}
func watch(using closure: @escaping (_ copiedString: String) -> Void) {
let pasteboard = NSPasteboard.general
var changeCount = NSPasteboard.general.changeCount
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
guard let copiedString = pasteboard.string(forType: .string),
pasteboard.changeCount != changeCount else { return }
defer {
changeCount = pasteboard.changeCount
}
closure(copiedString)
}
}
}
Swift异步等待版本:
import SwiftUI
@main
struct Test2App: App {
var isWatch = true
var body: some Scene {
WindowGroup {
ContentView()
.task {
while true {
let copy = await watch()
if let copy {
print("copy : \(copy)")
}
}
}
}
}
func watch() async -> String? {
let pasteboard = NSPasteboard.general
var changeCount = NSPasteboard.general.changeCount
try? await Task.sleep(nanoseconds: 500_000_000)
guard let copyString = pasteboard.string(forType: .string),
pasteboard.changeCount != changeCount else { return nil }
changeCount = pasteboard.changeCount
return copyString
}
}
请注意这只是样本。
你可以在此基础上做任何你想做的事情。