Swift & macOS
swiftUI, swift, xcode, macOS
原住民的自修室
公众号「原住民的自修室」,产品经理成长笔记,时间管理心得,外文优秀博客翻译
展开
-
Swift 的闭包为什么长这样?
刚接触 Swift 的开发者,很不解的一点是为什么 Swift 的闭包会长下面这样:Game(numberofCards:4){ index in return "hello"}不理解是正常的,因为上面的闭包其实是经过很多步骤的缩写,最终演化成如此简洁的形式,只要我们把每个简化的步骤一步步写出来,就很好理解了:正常的函数长这样:func normal(index: Int) -> String { return "hello"}把前面的func和normal去掉就是原创 2022-01-23 12:54:43 · 1768 阅读 · 0 评论 -
如何查看 Swift 的源代码
方法一第一种方式是在 Xcode 中使用 Command + 左键点击对应的类或方法名,在弹出的选项中点击 Jump to Definition 即可跳转。这种方法比较快捷,但有一定的局限:跳转的文档里其实只提供了协议、类、结构或方法的定义,没有具体的实现。方法二如果要看完整的代码,则需前往 Apple 官方的 Github 下载源码:GitHub - apple/swift: The Swift Programming Language使用 git 下载,或点击 Do.原创 2022-01-23 12:45:11 · 3287 阅读 · 0 评论 -
Swift 中 rethrows 的用法
rethows 是 Swift 中非常重要的处理错误的方法。如果一个函数A(例如map)的其中一个参数是一个函数类型B(map的闭包),且B有可能接受throw或不throw的函数,那么A就可以声明为rethrows,这时如果接受的B是不需要的throw的,就不用写do catch来处理错误,如果接受的是throw的才需要。我们以 Swift 源代码中的 map 方法为例,来帮助我们理解 rethrows:@inlinable public func map<T>(_ tran原创 2022-01-23 12:30:04 · 2248 阅读 · 0 评论 -
Xcode 调试之暗黑模式与多语言
如果你的应用支持暗黑模式和多个语言,调试时不需要每次在系统中更改系统配置,Xcode 已经支持了这两者的调试。暗黑模式:运行程序后在 Debug Area 实时调整多语言切换:点击顶部的 Edit Schema,并在 Options 进行语言切换。...原创 2021-11-21 22:29:56 · 712 阅读 · 0 评论 -
Swift中多Closure函数的语法糖,以Button为例
SwiftUI 中 Button 在官方文档中的初始函数定义是init(action: () -> Void, label: () -> Label),但在实际使用时,我们常常写成:Button { Do something } label: { Text("buttonName") }这个语法仔细看起来十分奇怪,因为按照 Swift 常见的尾随闭包,应该是最后一个参数不加标签,前面的参数增加标签才对,如下:Button (action: {Do something }){...原创 2021-11-21 11:40:03 · 1515 阅读 · 0 评论 -
Xcode 调试之 #if DEBUG
在调试应用的时候,我们会遇到一些功能或界面需要在测试的时候显示,但是上线后隐藏。比如说我的应用 Eye Monitor 会在用户工作一定时长后弹出一个全屏提醒,在测试时我需要一个按钮让我主动触发这个全屏提醒进行调试。以前我会通过两种方式实现:第一种是直接在代码里新增内容,并在上方用 //Test 标注,在上线前删掉。第二种是将一些测试功能如按钮隐藏在看起来不可点击的区域,这样即使不小心上线了也不影响用户。最近发现用 #if DEBUG 在很多情况下会更方便。在 #if DEBUG 和 #en原创 2021-11-19 08:33:16 · 833 阅读 · 0 评论 -
Xcode 中使用 Color Panel 查看颜色
在 Swift 开发中,我们经常会用到 Color 或 UIColor 中预置的颜色,比如 Color.red,NSColor.windowBackgroundColor。但是有时候,Apple 预置的名字命名并不能让我们知道到底效果如何,例如下面这几个,光看名字你能知道最终出来的会是什么颜色吗?NSColor.windowBackgroundColor NSColor.controlBackgroundColor NSColor.seletedTextBackgroundColor NSC.原创 2021-08-22 18:27:22 · 725 阅读 · 0 评论 -
Swift的.语法( .leading / .red等)
在 Swift 中,"."最常用的使用方式是“(class 或 struct的实例).(成员变量)”或“(class 或 struct).(静态成员变量)”,比如 apple.color,UIColor.red。但是我们不时也会看到"."前面没有任何修饰,比如VStack(.leading){ //some codes}UIColor(.red)VStack(.leading){ //some codes } UIColor(.red)这种语法叫做”Implicit Member原创 2021-08-22 08:55:49 · 316 阅读 · 0 评论 -
2021-04-13
最近在给Eye Monitor 写开机启动的功能,本以为macOS App 开机启动(Launch at Login)会是一个很简单的功能,实现会很轻松,没想到苹果居然没有提供简易的实现方式。还好在Github上发现了sindresorhus 已经实现了一个方便的 SwiftUI和Swift实现。简而言之,只要在Build Phase 里加入一行Script:然后就可以用SwiftUI写开关支持用户选择是否开机启动了:不过有一点需要注意的是,如果你的包名包含空格,直接用作者的Scri原创 2021-04-13 22:54:51 · 103 阅读 · 0 评论 -
使用Script报错No such file or directory,Command PhaseScriptExecution failed with a nonzero exit code
最近在写下个版本的Eye Monitor,增加开机启动功能,所以就用到了github 上 LaunchAtLogin 这个依赖。LauchAtLogin非常好用,只需在Run Script里加入${BUILT_PRODUCTS_DIR}/LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh就实现了macOS 上的开机启动功能,build 也顺利通过了。然而在 Archive 的时候,遇到报错:原创 2021-04-13 22:46:09 · 2119 阅读 · 0 评论 -
为了防止久坐和用眼过度,我写了一款macOS用眼监控应用
背景几个月前,我发现自己常常在电脑前连续办公好几个小时,导致眼睛和腰背出现了不适。由于并没有购买Apple Watch或小米手环等有久坐提醒功能的佩戴类产品,所以我想通过软件解决这个问题。在Mac上的App Store简单搜索后发现大多数健康类应用需要手动设置时间,手动开启计时,时间到后提醒,整个操作比较麻烦,且缺少灵活性。此外,在办公场景下,我们休息时间并非固定的,而是比较灵活随意的,很难预设连续工作时长。举个典型的例子:在连续办公35分钟后,起身去趟洗手间5分钟,从洗手间回来后继续办公。原创 2021-03-20 20:47:52 · 274 阅读 · 0 评论 -
App Store Review报错 crashed on launch,simulator正常
昨天打包上传App Store,审核结果是 crashed on launch,但是明明在模拟器和真机上都是正常的啊。考虑到在模拟器上是debug模式,于是在schema里改成release模式调试,果然就在启动时崩溃了。最终定位到问题是在Target的配置中,App Group只在Debug里添加了,在Release没有添加,导致在Release环境下无法读取到共享的持久化存储。所以经验就是,如果我们在调试时没有问题,但是App Store反馈有崩溃,那可能是debug模式和relea原创 2020-12-02 23:49:13 · 248 阅读 · 0 评论 -
Xcode使用&调试技巧(debugging)
基于Xcode11.5版本本文分为 使用技巧 面包屑导航 批量Rename 快速查看文档 代码折叠 调试技巧(debugging) 日志打印(log) 断点调试(Breakpoint) 条件断点(conditional BreakPoint) UI层级(UI Hierarchy) 内存层级(Memory Graph Hierarchy) .原创 2020-08-09 20:42:22 · 1408 阅读 · 0 评论 -
SwiftUI与macOS开发:menuBar/statusBar详解
macOS的menuBar功能非常强大,我们在开发macOS应用的时候,经常需要利用menuBar实现功能。然而网上关于menuBar开发的文档却甚少,更别提用上SwiftUI开发的。这篇文章从以下几部分讲解用SwiftUI开发menuBar/statusBar的方法,希望对大家有帮助:一、在statusBarItem弹出Popover二、更改Popover背景色三、在statusBar上控制主窗口的开关四、在statusBar上控制statusBar的显隐/开关一、在statusBar原创 2020-07-01 18:18:14 · 1357 阅读 · 0 评论 -
swiftUI与macOS开发:用SwiftUI开发menuBar
macOS的menuBar功能非常强大,我们在开发macOS应用的时候,经常需要利用menuBar实现功能。这篇文章主要是关于如何用swiftUI优雅地现在menuBar的popover。最终效果图:创建Popover在AppDelegate文件中,声明一个NSPopover变量(下面的statusBarItem之后会用到)var popover: NSPopover! var statusBarItem: NSStatusItem!随后,在applicatio...原创 2020-06-29 23:12:54 · 867 阅读 · 1 评论 -
SwiftUI与macOS开发:toolbar无法放置按钮
在Swift学习笔记:swiftui修改toolbar/titlebar中,我们讲到可以将toolbar设置成透明,就可以将ContextView的内容延伸到toolbar中。在实践过程中发现有个问题:button控件是无法放置在toolbar中的,可以用Text代替,就可以和关闭、最大化等按钮平行了。...原创 2020-06-27 21:31:09 · 304 阅读 · 0 评论 -
SwiftUI与macOS开发:swiftui修改toolbar/titlebar
let contentView = ContentView().environment(\.managedObjectContext, persistentContainer.viewContext).frame(minWidth: 450, maxWidth: .infinity, minHeight: 400, maxHeight: .infinity) // Create the titlebar accessory let titlebarAccessoryVie.原创 2020-06-27 20:02:26 · 973 阅读 · 0 评论 -
SwiftUI与macOS开发:macOS窗台控制(window)--默认尺寸、最小尺寸和颜色
窗口大小的设置主要在AppDelegate.swift中配置设置默认窗口大小通过windows.setFrame方法设置窗口大小func applicationDidFinishLaunching(_ aNotification: Notification) { // Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath.原创 2020-06-26 19:09:58 · 3255 阅读 · 0 评论 -
SwiftUI与macOS开发:使用Core Data 如何打开preview
使用Core Data后,如果用默认的preview是无法显示出预览视图的,我们必须在preview里加入managedObjectContext并作为环境变量传入ContentView中,这样preview视图才能获取到我们的Core Data,代码如下:struct ContentView_Previews: PreviewProvider { static var previews: some View { let managedObjectContext: NSMana原创 2020-06-26 16:06:17 · 431 阅读 · 0 评论 -
Swift学习笔记:Core Data 基础学习资料
Core Data是swift里常用的持久性存储方式,以下是我在学习Core Data过程中发现的比较有用的资料CoreData Ordered Lists in SwiftUI Part 1,CoreData Ordered Lists in SwiftUI Part 2通过一个清单App演示CoreData的增删改查 CoreData教程,讲解了创建entity、创建relation、插入、更新、删除、查询、条件查询、排序、分组等操作,并分享本人对CoreData的一些独立见解(关于CoreDat原创 2020-06-26 16:02:24 · 254 阅读 · 0 评论 -
Swift学习笔记:Core Data 删除时崩溃,Crash when delete core data
ForEach (self.countdownItems,id: \.myid) { (countdown:CountdownItem) in HStack{ CountdownItemView(countdown:countdown).contextMenu{ Button(action: { se.原创 2020-06-26 15:46:51 · 329 阅读 · 1 评论 -
Swift学习笔记:No NSEntityDescriptions in any model claim the NSManagedObject subclass 解决方法
TimeCard[41935:10278070] [error] error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'TimeCard.CountdownItem' so +entity is confused. Have you loaded your NSManagedObjectModel yet ?CoreData: error: No NSEntityDescriptions in a.原创 2020-06-24 22:27:20 · 796 阅读 · 0 评论