Swift way to explore https:https://cdn.v2ex.com/navatar/4c27/cea8/638_normal.png?m=1661630260 https:https://cdn.v2ex.com/navatar/4c27/cea8/638_large.png?m=1661630260 2025-06-19T14:43:36Z Copyright © 2010-2018, V2EX FoundationModels 框架实践 tag:www.v2ex.com,2025-06-29:/t/1141821 2025-06-29T14:44:36Z 2025-06-19T14:43:36Z Lambert2022 member/Lambert2022 周末使用 TCA + SharingGRDB 撸了一个简单的 FoundationModels 聊天应用;目前只完成了基本功能
https://imgur.com/hBFb7BF 代码: https://github.com/Anderson-Hyl/FoundationModelsChat

]]> Swift DocC 构建的博客 tag:www.v2ex.com,2025-06-14:/t/1138615 2025-06-14T13:28:09Z 2025-06-14T18:58:32Z Lambert2022 member/Lambert2022 https://anderson-hyl.github.io/Anderson-s-Blog/ ]]> Swift server 要支棱起来了 tag:www.v2ex.com,2025-06-05:/t/1136602 2025-06-05T08:04:43Z 2025-06-05T06:04:43Z wsseo member/wsseo 求问贴,如果在 swiftUI 中接入 MySQL C client tag:www.v2ex.com,2025-06-03:/t/1135989 2025-06-03T03:51:15Z 2025-06-03T09:54:18Z webashe11 member/webashe11
1. arm 、intel 如何做系统区分
2. 一定需要本地 brew install mysql 么 ]]>
Swift 萌新, DispatchQueue 的一个问题 tag:www.v2ex.com,2025-05-18:/t/1132529 2025-05-18T05:45:38Z 2025-05-27T23:05:54Z main1234 member/main1234 使用的 Xcode 16.2 、swift 6.0.3

代码如下

import Foundation DispatchQueue.global().async { // 耗时操作(如网络请求、文件处理) let data = downloadData() DispatchQueue.main.async { updateUI(with: data) } } func downloadData() -> String{ sleep(2) return "a" } func updateUI(with: Any) { print("updateUI") } sleep(10) 

为什么我无法输出 updateUI

我应该如何在切换到主线程时候,让主线程输出 updateUI

]]>
分享一下一个 Web 前端刚学习 Swift 时候的心得博文 tag:www.v2ex.com,2025-04-08:/t/1123864 2025-04-08T01:38:57Z 2025-04-25T21:11:59Z Xheldon member/Xheldon
https://www.xheldon.com/tech/app-dev-journey-swift

是我的个人博客,没兴趣的不用点进去了,免得说我挂外链引流。

主要内容是本人作为 9 年 Web 前端刚接触 Swift 的时候跟 TS 对比的差异点总结,当然司空见惯的差异就没写,比如 TS 中没有数字类型 Int 和 Double 这种的。 ]]>
5 分钟用 Swift 写个 ripripgrep tag:www.v2ex.com,2025-03-23:/t/1120436 2025-03-23T05:58:53Z 2025-03-23T05:58:53Z MrKrabs member/MrKrabs 你别管什么 NFC ,NFD ,咱只是想搜出日语呢

import Foundation import ArgumentParser @main struct Ripripgrep: ParsableCommand { @Option(name: .shortAndLong) var patterns: [String] @Argument(help: "use stdin if no args") var files: [String] = [] func validate() throws { if patterns.isEmpty { fatalError("no patterns!") } } struct Worker { var line: UnsafeMutablePointer<CChar>? var linecap = 0 let patterns: [Regex<AnyRegexOutput>] mutating func start(stream: UnsafeMutablePointer<FILE>) { while case let linelen = getline(&line, &linecap, stream), linelen > 0 { let line = String(decoding: UnsafeRawBufferPointer(start: line!, count: linelen-1), as: UTF8.self) if patterns.allSatisfy({ line.contains($0) }) { print(line) } } } } func run() throws { var worker = Worker(patterns: try patterns.map { try Regex($0).ignoresCase() }) if files.isEmpty { // use stdin worker.start(stream: stdin) } else { for file in files { let stream = fopen(file, "rb")! defer { fclose(stream) } worker.start(stream: stream) } } } } 
]]>
Swift 操作 plist 文件 tag:www.v2ex.com,2025-02-05:/t/1109153 2025-02-05T09:54:51Z 2025-02-05T11:44:09Z f1197199424 member/f1197199424 我有一定的开发经验 但是无 IOS 或者 MacOS 开发经验。
我尝试使用 PropertyListSerialization 来操作,他是系统内置,不需要引入额外的开发包。但是带来的问题也就很麻烦。比如我通过命令行执行:
```
/usr/libexec/PlistBuddy -c "Add :NowDays:1:Children:0:Checked dict" xx.plist
```
就很方便,但是使用 PropertyListSerialization 就特别难受。

所以请教下各位 IOS 或者 MacOS 大佬,有无类似的经验,给小弟一点启发或者参考。谢谢🙏。 ]]>
使用 SwiftUI + TCA 重构 Instagram Clone:从 Flutter 到 SwiftUI 的迁移实践 tag:www.v2ex.com,2025-01-11:/t/1104338 2025-01-11T05:21:03Z 2025-01-11T19:04:51Z Lambert2022 member/Lambert2022 基于现有 Flutter Instagram Clone 项目进行 SwiftUI 重构 SwiftUI + TCA + PowerSync + Supabase 离线优先、实时同步 Github

]]>
激发编程激情,轻松掌握 Swift SwiftUI tag:www.v2ex.com,2025-01-06:/t/1102959 2025-01-06T08:47:59Z 2025-01-06T09:45:59Z wendstation member/wendstation 最近开发了一个 APP ,核心功能是:


  1. 多语言支持:覆盖全球主要语言,满足不同用户的需求。(70+ 语言)
  2. 高效筛选与定位:根据模块、文档类型、API 状态、操作系统、代码片段快速找到所需文档。
  3. 本地化搜索:用您的语言搜索,让信息获取更直接。
  4. 私人定制教程:提供从零开始的 Swift 学习路径,适合所有水平的开发者。
  5. 文档导出: 将文档导出为 Markdown 格式,轻松分享。
  6. 笔记功能: 支持 iCloud 笔记同步,确保您的笔记安全且私密。

我们的目标是简化您的学习过程,让 Swift 开发变得前所未有的简单。

]]>
分享个基于 UICollectionView 封装的数据驱动和声明式组件库 ListKit tag:www.v2ex.com,2024-12-29:/t/1101104 2024-12-29T14:47:59Z 2024-12-29T14:47:59Z zhbhun member/zhbhun https://github.com/zhbhun/ListKit

本身是个前端开发,最近一个月因业务需要在使用 Swift 和 UIKit 开发 iOS 应用。但是旧项目中各种代理和协议,都让代码跳来跳出,另外项目中没有规范的 MVVM 开发方式,让状态流和 UI 命令式更新,像蜘蛛网一样各种乱闯,看得我脑壳疼,所以动手做了个 ListKit 项目,求各位大佬指点下,这样写是不是有什么问题,或者有什么更好的建议?

ps:目前我在使用声明式的方式写复杂配置的时候,会遇到 Swift 提示编译器无法解析,让我拆分表达式的问题😭!

]]>
问一个关于 CALayer 的资源释放问题 tag:www.v2ex.com,2024-11-29:/t/1093851 2024-11-29T16:22:32Z 2024-11-29T16:21:32Z blackguester member/blackguester 假设一个 CALayer 会生成一些子 layers ,重置的时候,各位是用removeFromSuperlayer,还是直接sublayers = []?

class Mycalayer: CALayer { func update () { // insert some Sublayers here ..... } func refresh () { // reset all sublayers self.sublayers?.forEach { layer in layer.removeFromSuperlayer() } // OR Just self.sublayers = [] } } 
]]>
SwiftUI 的 TextEditor 在 macOS Sequoia 15.0 上输入中文时又会这样一跳一跳的了 tag:www.v2ex.com,2024-09-30:/t/1077170 2024-09-30T09:40:36Z 2024-09-30T14:17:20Z Livid member/Livid
]]>
Swift 中系统 API delegate 参数一定要在当前类实现传 self 吗 tag:www.v2ex.com,2024-09-29:/t/1076938 2024-09-29T14:25:35Z 2024-10-01T21:43:02Z jiangzm member/jiangzm 因为要写原生插件,swift 刚接触,语法比 objc 好看多了。

在开发相机组件时遇到一个问题,AVCapturePhotoCaptureDelegate 契约用自定义 UIView/UIViewController 实现没问题, 换成独立的类实现就回调不了,不是什么原因。

上代码:

TakePhotoDelegate.swift

import Foundation import AVFoundation import UIKit public typealias TakePhotoCallback = ((String, String) -> Void)?; class TakePhotoWithCompletion : NSObject, AVCapturePhotoCaptureDelegate { // ... var completion: TakePhotoCallback; init(callback: TakePhotoCallback) { self.completion = callback; super.init(); } func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { // todo sth self.completion!("{file path}", "{error}"); } } 

CameraxView.swift

import AVFoundation import UIKit class CameraxView: UIView { // ... @objc func takePhoto(options: Dictionary<String, String>, completion: TakePhotoCallback) { let photoSettings = AVCapturePhotoSettings.init(format:[AVVideoCodecKey:AVVideoCodecType.jpeg]) let delegate = TakePhotoWithCompletion.init(callback: completion) imageOutPut?.capturePhoto(with:photoSettings, delegate: delegate) } // ... } 

点击拍照按钮能听到快门声,但是 photoOutput 没有回调

如果换成如下自定义 UIView 实现 AVCapturePhotoCaptureDelegate 没有问题,能正常回调

import AVFoundation import UIKit class CameraxView: UIView, AVCapturePhotoCaptureDelegate { // ... var completion: TakePhotoCallback = nil; @objc func takePhoto(options: Dictionary<String, String>) { let photoSettings = AVCapturePhotoSettings.init(format:[AVVideoCodecKey:AVVideoCodecType.jpeg]) self.completion = completion imageOutPut?.capturePhoto(with:photoSettings, delegate: self) } @objc func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { // todo sth self.completion!("{file path}", "{error}"); } // ... } 

有这个差异的原因是因为系统 API 的限制吗还是 swift 语言层面问题, 如果 takePhoto 方法希望传闭包参数回调拍照结果,正确应该怎么写。

(回调参数赋值给实例对象, 个人感觉是个很奇怪的做法)

]]>
ScreenCaptureKit 里面的 SCStreamOutput 没有被顺利触发,是那个步骤错了,求解惑 tag:www.v2ex.com,2024-09-20:/t/1074320 2024-09-20T03:33:03Z 2024-09-20T03:33:03Z happydoze member/happydoze 代码如下:

import SwiftUI import ScreenCaptureKit struct ContentView: View { @State private var showingScreenshotAlert = false @State private var screenshotRect = CGRect(x: 100, y: 100, width: 400, height: 300) // 示例区域 @State private var cc = "截图 1" var body: some View { VStack { Text("点击下方按钮进行截图") .padding() Button(action: takeScreenshot) { Text(cc) .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(8) } } .alert(isPresented: $showingScreenshotAlert) { Alert(title: Text("截图完成"), message: Text("截图已保存至桌面"), dismissButton: .default(Text("确定"))) } } class MyStreamOutput: NSObject, SCStreamOutput { var onCaptureCompletion: (() -> Void)? // 闭包,用于通知截图完成 func stream(_ stream: SCStream, didOutputSampleBuffer sampleBuffer: CMSampleBuffer, of type: SCStreamOutputType) { // 每当捕获到新的样本帧时打印消息 print("Captured a new frame of type") onCaptureCompletion?()// 调用闭包通知截图完成 } } func takeScreenshot() { cc = "在截图 1..." showingScreenshotAlert = true SCShareableContent.getWithCompletionHandler { (content, error) in if let error = error { print("Error: \(error)") } else if let cOntent= content { print("Displays: \(content.displays)") print("Displays: \(content.displays[0])") print("Displays: \(content.displays[0].width)") print("Displays: \(content.displays[0].height)") print("Windows:\(content.windows[23])") print("Windows ID:\(content.windows[23].windowID)") print("Windows Count:\(content.windows.count)") // MARK: - 创建 // 创建一个过滤器以捕获整个屏幕 let filter1 = SCContentFilter(display: content.displays[0], excludingWindows: []) let config1 = SCStreamConfiguration() let stream1 = SCStream(filter: filter1, configuration: config1, delegate: nil) // 实例化我们的输出处理类 let streamOutput = MyStreamOutput() // 定义截图完成时的动作 streamOutput.OnCaptureCompletion= { DispatchQueue.main.async { cc = "截图完成了" print("-----------") } } // 添加输出 do { try stream1.addStreamOutput(streamOutput, type: .screen, sampleHandlerQueue: DispatchQueue.main) print("流输出已成功添加") } catch { print("添加流输出时出错: \(error)") } stream1.startCapture { error in if let error = error { print("Failed to start capture: \(error)") } else { print("Capture started successfully!") } } } } } } 
]]>
似乎 SwiftUI app 在 macOS 15 上启动速度变快很多? tag:www.v2ex.com,2024-09-16:/t/1073401 2024-09-16T20:53:06Z 2024-09-16T22:55:28Z Livid member/Livid 现在只需要在 Dock 上跳一下就启动完成了。

]]>
请教一个关于 Swift 的基础小问题 tag:www.v2ex.com,2024-08-29:/t/1068887 2024-08-29T21:00:20Z 2024-09-05T09:58:10Z qdwang member/qdwang 在锁屏幕方向的情况下,如何获取设备的方向呢?

我试了网上各种方法都不行,用了官方文档说可以的UIDevice.current.orientation,也不行。。。

]]>
离线 iOS app 也需要 ICP ? tag:www.v2ex.com,2024-07-28:/t/1060673 2024-07-28T08:48:03Z 2024-08-12T21:48:03Z jamesdd member/jamesdd 提及了 iOS app 的更新,提及 review 的时候被要求提供 ICP:

Unable to Add for Review The items below are required to start the review process: You must provide an Internet Content Provider (ICP) Filing Number to make this app available on the App Store in China mainland. Go to App Information 

然而我的 app 是可以离线运行的,不需要联网,也没有 server 端,在 Xcode 的项目中也把 networkextension 从 Signing&Capabilities 中删除了。

大家是否遇到过类似情况?不太明白 App store connect 是如何判断是否应该需要 ICP 的。

]]>
请教 SwiftUI 布局的问题 tag:www.v2ex.com,2024-07-27:/t/1060506 2024-07-27T05:38:18Z 2024-07-27T10:04:43Z whoami9426 member/whoami9426 想要实现一个上下分页滑动,左右分页滑动的交互效果

 var body: some View{ ScrollView(showsIndicators: false){ LazyVStack(spacing:0){ ForEach(1...10, id: \.self){ index in ScrollView(.horizontal,showsIndicators: false){ LazyHStack(spacing:0){ VStack { Text("Left View \(index)") .font(.system(.largeTitle)) .foregroundStyle(.white) } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.black) .containerRelativeFrame([.horizontal,.vertical]) VStack { Text("Right View \(index)") .font(.system(.largeTitle)) .foregroundStyle(.white) } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.blue) .containerRelativeFrame([.horizontal,.vertical]) }.scrollTargetLayout() } .ignoresSafeArea() .containerRelativeFrame([.horizontal,.vertical]) .scrollTargetBehavior(.paging) .onAppear(perform: { UIScrollView.appearance().bounces = false UIScrollView.appearance().alwaysBounceVertical = false UIScrollView.appearance().alwaysBounceHorizOntal= false }) } }.scrollTargetLayout() } .ignoresSafeArea() .containerRelativeFrame([.horizontal,.vertical]) .scrollTargetBehavior(.paging) } 

目前用这种方式实现,但是有个问题,滑动到 RightView 可以上下滑动到下一层,有什么办法在滑动到 RightView 时只允许左滑回 Left View

]]>
ios 17 widget 无法正确更新 core data tag:www.v2ex.com,2024-06-17:/t/1050259 2024-06-17T08:37:17Z 2024-06-17T08:37:17Z izzy27 member/izzy27 我正在开发的一个 iOS 17 Widget ,它可以为用户的 Thing 对象进行打卡。

当我同时创建多个 Widget 实例时,无论点击哪个 Widget 实例进行打卡,它们更新的都是第一个 Thing ,看起来多个 Widget 都重复指向了同一个 Thing 。

我后面经过排查,发现是我的 AppIntent 中,Parameter 并不起作用,用户无论选择哪个 thing,perform 中的 thing 都是 EntityQuery 中的 defaultResult 的返回值

struct ConfigurationAppIntent: WidgetConfigurationIntent { @Parameter(title:"Select thing") var thing: ThingData func perform() async throws -> some IntentResult { print("perform thing: \(thing)") // 这里会直接返回 defaultResult 的结果,而不是用户选择的 thing } } // EntityQuery 中的代码 // AppIntent 中的 thing ,永远是这里的返回结果,而不是用户选择的结果 func defaultResult() async -> ThingData? { logger.info("Entering defaultResult()") let cOntext= PersistenceController.shared.viewContext let fetchRequest: NSFetchRequest<Thing> = Thing.fetchRequest() fetchRequest.fetchLimit = 1 do { let things = try context.fetch(fetchRequest) things.forEach { logger.info("Default Thing: \($0.description)") } logger.info("Exiting defaultResult()") return things.first?.toThingData() } catch { logger.error("Error fetching default result: \(error.localizedDescription)") logger.info("Exiting defaultResult()") return nil } } 

而且这样会有一个问题,比如说我有五六个 thing ,用户为每个 thing 都添加了一个 widget ,但是由于这个 bug 的存在,导致只有 defaultResult 返回的 Thing 会更新,其他都不会更新

哪位大佬知道怎么解决吗?修了两天了,文档、视频、教程看了一遍,都没发现解决办法。。真的很痛苦 T_T

]]>
有没有 Swift ui 版本的 tailwind css? tag:www.v2ex.com,2024-06-03:/t/1046337 2024-06-03T05:21:01Z 2024-06-03T05:21:01Z izzy27 member/izzy27 swiftui 里,这里用 hstack,为什么是垂直布局,而不是水平布局? tag:www.v2ex.com,2024-05-30:/t/1045333 2024-05-30T04:22:13Z 2024-07-09T01:27:19Z infyni member/infyni 半路出家学 swiftui,现在在写一个 macos 的状态栏的应用, 有个布局问题我一直搞不懂啊.

比如下面的代码:

 @SceneBuilder private func menuBarExtra() -> some Scene { if #available(macOS 13.0, *) { MenuBarExtra(isInserted: $statusMenu){ AppMenu() } label: { let image: NSImage = { let ratio = $0.size.height / $0.size.width $0.size.height = 18 $0.size.width = 18 / ratio return $0 }(NSImage(named: "Finder")!) Image(nsImage: image) } } 
 struct AppMenu: View { var body: some View { HStack{ Text("1") Text("2") Text("3") } } } 

我的期望是,三个 text 应该是水平布局吧.为什么实际出来会是垂直布局呢?

image

请各位大佬解惑,我去问过 gpt, 没问出来结果.

]]>
大家觉得 Swift 的参数必须按序提供怎么样? tag:www.v2ex.com,2024-05-29:/t/1044950 2024-05-29T02:25:10Z 2024-05-29T02:25:10Z zhwguest member/zhwguest 我是觉得挺别扭的,已经有标签了,为什么还要遵循顺序,让编译器做多好。

]]>
Swift 开源的组件库好像不是很多啊 tag:www.v2ex.com,2024-05-25:/t/1043961 2024-05-25T15:53:08Z 2024-05-25T15:53:08Z izzy27 member/izzy27 不想重复造轮子,但是网上的组件要么过期了,要么功能不是很齐全

]]>
Swift 如何像 Python 那样 崩溃了输出 backtrace 或者至少是哪行出错了。。。 tag:www.v2ex.com,2024-05-13:/t/1040249 2024-05-13T06:25:04Z 2024-05-13T06:50:39Z chopin1998519 member/chopin1998519 swift 新手

写了一个 1000 多行的代码, 没有用 xcode 开发, 直接 vscode 撸的,

运行时 直接 ./main.swift (代码首行 #!env swift ) 或者 swiftc main.swift -o main.bin , 然后 ./main.bin 运行

现在程序大体稳定, 但是偶尔会崩溃一下, 崩溃时只是提示 crash 和很少信息, 搞不清楚哪里错误。

也试过 swiftc -g main.swift -o main.bin 然后有 lldb ./main.bin , 再 run, crash 的时候提示 error: No auto repeat.com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
(lldb) me #0: 0x0000000192db0154 CoreFoundationCFGetTypeID + 100

就不会了。。。

有没有可能像 python 那些,crash 了告诉我是哪行因为什么原因错掉的呢??

谢谢各位大佬!

]]>
请教一下各位 iOSer 巨佬们一个 SwiftUI sheet 组件的问题 tag:www.v2ex.com,2024-04-28:/t/1036449 2024-04-28T08:47:09Z 2024-05-14T07:22:22Z realzzz member/realzzz 页面内容是:有一个卡片列表,点击卡片,弹窗展示卡片详情。 目前问题,首次点击后,弹窗有打开,但是弹窗里没有渲染内容,关闭后打开其它卡片可正常显示。。。

简化代码如下:

@State private var showStudentDetail: Bool = false @State private var studentDetail: Student? ... VStack(alignment: .leading, spacing: 12) { ForEach(students) { student in CardView(student: student) .onTapGesture { studentDetail = student showStudentDetail.toggle() } } .sheet(isPresented: $showStudentDetail) { if let studentDetail = studentDetail { StudentDetailView(student: studentDetail) } } } 
]]>
请教一下各位 iOSer 巨佬们一个 SwiftUI 中 HStack 的布局问题 tag:www.v2ex.com,2024-04-15:/t/1032689 2024-04-15T09:15:33Z 2024-04-15T10:48:21Z realzzz member/realzzz swiftUI 新手求教,在 HStack 中,如果超出屏幕宽度,子元素如何自动换行呢?

有像 web 开发中的 flex wrap 属性吗?

大概像是这个图的效果:

1713172462275.png

]]>
swiftui 有好用的组件库吗? tag:www.v2ex.com,2024-04-12:/t/1032030 2024-04-12T09:42:40Z 2024-04-12T09:42:40Z sunshinev member/sunshinev swiftui 用起来很灵活,但是感觉像搜索框,这些是不是可以直接有封装好的组件啥的

比如图片翻页浏览这些

]]>
求问:苹果手机是否无法像安卓一样,可以扫描出本地的音乐? tag:www.v2ex.com,2024-04-12:/t/1031831 2024-04-12T01:22:58Z 2024-04-02T01:30:42Z ZhuWenJian member/ZhuWenJian 有个 idea ,目前是用 flutter 进行开发,但是发现无法获取本地音乐。 下载了几个 app ,像 QQ 音乐、网易云音乐以及其它的一些 app ,都没法获取到在其它第三方 app 上下载的音乐。 不知道是不是我下载的少,还是操作之类的不对。 所以问下:苹果手机上的 app ,无法获取其它应用下载的音乐?

]]>
macOS 沙盒中如何获得对任意目录的写权限? tag:www.v2ex.com,2024-03-19:/t/1025133 2024-03-19T09:20:31Z 2024-03-18T09:20:31Z jamesdd member/jamesdd 打算做一个 macOS app 来安装自己的一个插件到 Adobe 应用,在我的 app 中来把插件安装到 Adobe 应用的目录中。 1.如果 Adobe 应用是安装在默认目录 /Appliactions 中,不需要用户选择; 2.用户可以选择一个目录来进行插件的安装。 问题是在 sandbox 中是没有其他目录的写权限的,该如何申请写权限?目前探索到的方法是需要用户手动选择一个目录(用 NSOpenPanel),这只适合上面提到的第 2 种场景,但如果重启 app 后用户上次选择的路径也没有权限了。 请问有没有什么方法可以在 sandbox ( app 计划发布到 app store )中申请任意文件夹的写权限?还是说 macOS 上为了安全没有这个机制,只能用户选择具体路径? 不用具体代码,麻烦指个方向,该学习 apple 的哪方面的开发主题。 多谢!

]]>
swiftui 中的语法糖疑问 tag:www.v2ex.com,2024-03-07:/t/1021570 2024-03-07T10:17:38Z 2024-03-08T09:50:18Z rookiemaster member/rookiemaster VStack{ Image(systemName: "globe") Text("👻").font(.largeTitle) }

上面是一段 swiftui 代码,它能创建一个垂直排列的 view ,里面的闭包是作为 VStack.init 中 content 的参数,查看源码可知 content 的类型是()->Content 。 我的疑问是

Image(systemName: "globe") Text("👻").font(.largeTitle) 

是什么语法,他为什么能返回一个 Content ,我所了解的是要是只有一行代码的话才可以忽略掉 return ,这里不是有两行嘛,求解答。

]]>
开发 macOS 应用无法访问用户选择的文件夹下的文件 tag:www.v2ex.com,2024-02-17:/t/1016042 2024-02-17T11:38:17Z 2024-02-17T12:36:17Z ShiJh member/ShiJh 开发 macOS 应用遇到的文件访问权限问题

无法访问用户选择的文件夹下的文件,这个问题我也发到Stackoverflow中,大佬们能否看看👀,在这里或者 stackoverflow 中回答都可以!

应用的目标是获取文件夹下的所有视频,储存成一个数组,在需要的时候使用 URL 加载视频。调查了几款视频播放 App 都能支持,不知道为什么我按照网上的教程操作后,仍然无法支持

另一个不重要的小问题

我想用 SwiftUI 中的.help 修饰符在 hover 的时候显示 tooltip ,但是在 macOS 14.0 中无法生效,其他系统版本未测试

]]>
弄了一个 Swift 官方教程的速览版 tag:www.v2ex.com,2024-01-19:/t/1009883 2024-01-19T01:17:58Z 2024-01-26T20:32:47Z YugenFring member/YugenFring 有需要的朋友点个 star 呀, 自己也是刚学, 觉得官方教程虽然详细, 但是确实有点长, 不方便查阅和快速学习

贴个链接: https://github.com/YugenFring/swift-tutorial-quickstart

image

]]>
2024 年了,现在学 SwiftUI 还有必要学 UIkit 吗? tag:www.v2ex.com,2023-12-29:/t/1004278 2023-12-29T01:07:52Z 2024-01-18T10:21:33Z terrysnake member/terrysnake 如题,出入门,主学 SwiftUI 做一些简单的 iOS APP ,还有必要学 UIkit 吗? 现在的库够吗?

感谢解答

]]>
大佬们指点下苹果生态下音频相关的这些库都是什么关系? tag:www.v2ex.com,2023-12-03:/t/997316 2023-12-03T14:14:05Z 2023-12-03T14:11:05Z Kinnikuman member/Kinnikuman 想学习一下音频相关的开发,但找了下,有太多的库供选择了,把我绕晕了:

如果想实现播放网络或者本地的音乐数据( flac/wav/mp3/aac/wma/ogg )应该用到哪些库?都是起到什么作用?

我理解的是,应该使用 ffmpeg 先进行 demux 解封装,然后再对 stream 进行 decode 获取到 PCM sample ,最后调用上面某一个库(可能是 Audio Engine )进行播放。

但我说的这个方法是软解码么?如果苹果自己支持的格式比如 mp3 等,是否可以不使用 ffmpeg 来解码?那应该用上面哪个库来处理?

还有音乐文件的 metadata 解析(音乐名/艺术家/封面/歌词等信息),如何提取 metadata? 苹果自家的仅支持 ID3 或者 iTunes ,对于其他格式的比如 wav/flac 等,应该怎么处理?

下面两个链接是我看过的参考资料,好像已经过时了。经过搜索也没有找到新的比较靠谱的讲解。

]]>
升级到 Xcode 15 之后遇到的 GeneratedAssetSymbols 过不了编译这个问题 tag:www.v2ex.com,2023-09-29:/t/978140 2023-09-29T05:28:02Z 2023-12-22T08:09:06Z Livid member/Livid 这貌似是 Xcode 15 的某个新功能自动生成了代码,却过不了自己的编译器。

目前查到的一个解决方案是在 xcconfig 里加上这 3 条把这个新功能暂时禁用。

ASSETCATALOG_COMPILER_GENERATE_ASSET_SYMBOLS = NO; ASSETCATALOG_COMPILER_GENERATE_ASSET_SYMBOL_FRAMEWORKS = ""; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIOnS= NO; 
]]>
现在用 Swift 开发后端成熟了吗? tag:www.v2ex.com,2023-09-13:/t/973337 2023-09-13T03:54:29Z 2023-10-02T13:48:29Z zhwguest member/zhwguest 希望大神来指点下,用得比较多的就是 http 的框架、crypto 的库,还有异步化。

]]>
Composable SwiftUI tag:www.v2ex.com,2023-08-18:/t/966566 2023-08-18T15:28:47Z 2023-08-18T16:34:42Z luamer member/luamer https://github.com/OpenLyl/Water

这个库能干什么?

- 渐进式的帮助你开发 SwiftUI 界面
- 状态管理原子化,可自由组合
- 可单独使用,也可与 TCA 和 MVVM 架构结合使用

总之,如果你觉得其他库复杂且不好掌握,或者你是一个 SwiftUI 新手,都可以尝试使用这个库 ]]>
2023 年, swiftui 使用 WKWebView 加载 html 字符串,如何自适应 frame 高度? tag:www.v2ex.com,2023-07-16:/t/957188 2023-07-16T12:01:26Z 2023-07-16T12:00:26Z 8888888888 member/8888888888 自学 swift 中,找了很多资料,试了都不太行,有大佬教一教怎么处理吗

]]>
用 network extension 框架开启 Tunnel,怎么能保持后台请求接口,解决请喝杯咖啡 tag:www.v2ex.com,2023-07-06:/t/954647 2023-07-06T10:03:48Z 2023-07-17T06:21:36Z wangsilence member/wangsilence 我用 network extension 框架开启 Tunnel 将 http 代理设置成我启动的一个端口,转发抓取 http 请求,但是切换到后台就不会再请求接口了,切换到前台运行的好好的。

]]>
学生党求问各位大佬,一个关于 ios 小组件的问题 tag:www.v2ex.com,2023-07-01:/t/953185 2023-07-01T01:13:56Z 2023-07-02T07:32:56Z ben123321 member/ben123321 背景是这样的,我们学校的老师要求我们做一个 iphone 的大作业。然而小弟我好死不死,为了能够找到实习的工作,追求前沿技术。想要做一个时钟小组件的应用。

做着做着,身边的同学也不选择小组件的应用。没同学可以请教。只能寻求网上厉害的大佬。

我遇到的问题是: 我想实现时钟小组件添加到桌面后能自动刷新。我只做到了小组件的秒针跑了几圈,然后就停下来了。

要是有大佬能够解答,愿意请大佬喝杯奶茶(学生党,请谅解)😂😂😂

]]>
比较好的 Swift UI 学习交流群 tag:www.v2ex.com,2023-05-25:/t/942929 2023-05-25T09:01:18Z 2023-05-25T11:01:18Z zouzls member/zouzls 有没有比较好的 Swift UI 学习交流群,工作闲鱼时间想学习自己开发个 app ,有一些想法,日后某一天说不定成独立开发者。

]]>
CAID 这垃圾东西是谁在推,一边喊着保护隐私,一边想着法子来跟踪用户 tag:www.v2ex.com,2023-05-19:/t/941360 2023-05-19T10:16:24Z 2023-05-19T10:17:33Z Dashit member/Dashit Swift 的 Optional 如何比较包装类型的关系呢? tag:www.v2ex.com,2023-04-23:/t/934873 2023-04-23T12:07:55Z 2023-04-23T12:07:55Z sl0000 member/sl0000 var a: Int? = nil print("\(type(of: a))") print("\(a is String?)") var b: Int? = 1 print("\(type(of: b))") print("\(b is String?)") /* output:: Optional<Int> true Optional<Int> false */

下面是 GPT 的答案

Imgur

]]>
Alamofire 推荐使用吗? tag:www.v2ex.com,2023-04-13:/t/932292 2023-04-13T09:19:06Z 2023-05-22T06:18:03Z 0littleboy member/0littleboy 最近在写 APP 的时候,发现了 Alamofire 这个东西

似乎可以替代自带的 URLSession.shared.dataTask 进行网络请求及自动解析 json 文件

可以极大简化开发难度

推荐使用吗,会不会遇到什么问题

]]>
我自己是初学者想找个朋友带我一起写两个工作用的 app 有偿的 tag:www.v2ex.com,2023-04-13:/t/932147 2023-04-13T01:55:20Z 2023-04-18T15:45:45Z novolei2018 member/novolei2018 主要是我个人工作需要的工具编写我自己能力有限但也写了一大半了 希望看到的好心人或大佬可以帮忙指导 有偿的

]]>
Swift 如何优化数据加载方式? tag:www.v2ex.com,2023-04-13:/t/932146 2023-04-13T01:53:52Z 2023-04-12T22:52:52Z 0littleboy member/0littleboy 我有一个用于记录全局数据的类

class GlobalData { // static let shared = GlobalData() // 不使用单例模式,没有实例,直接调用类 static var allProblems: [Problem] = getAllProblems() static var allContests: [Contest] = getAllContests() } 

问题其一是使用 static 加载速度太慢了,必须等其加载完才能显示 APP 的内容

给出其中一个调用 GlobalData 的样例

struct HistoryContestsView: View { @State var contests: [Contest] = GlobalData.allContests @State var allProblems: [Problem] = GlobalData.allProblems var body: some View { NavigationView { // ... } .refreshable { reloadHistoryContests() } } private func reloadHistoryContests() { GlobalData.allProblems = getAllProblems() allProblems = GlobalData.allProblems GlobalData.allCOntests= getAllContests() cOntests= GlobalData.allContests print("Successfully reload history contests") } } 

其二是 reloadHistoryContests 内容显得十分冗余

目前想到的策略是定义一个 ObservableObject 类 HistoryContestsView 就可以直接订阅 GlobalData 类 并且在 .task 中异步加载数据,也能解决性能问题

class GlobalData: ObservableObject { @Published var allProblems: [Problem] = [] @Published var allContests: [Contest] = [] func loadData() { // 加载数据的代码 // ... self.allProblems = getAllProblems() self.allCOntests= getAllContests() } } 

但又出现了个问题,在其他 model 文件中,原本调用 GlobalData.allContests 的函数,都无法使用了

func getPredictiveContestList(by userid: String) -> [User.AttendedContest] { let predictiveCOntests= Global.allContests.filter { $0.avgRatingOfProblems == nil } // print(predictiveContests) var res: [User.AttendedContest] = [] for contest in predictiveContests { /// 参加了且有了预测结果 // TODO - 后面统计参加了还没有结果的 if let tmp = predictRatingOfUser(by: contest.titleSlug, userid: userid) { res.append(tmp) } } return res } 

如何解决?

]]>
现在感觉 Swift 真的被 OC 拖后腿了 tag:www.v2ex.com,2023-04-07:/t/930584 2023-04-07T06:52:17Z 2023-06-22T12:22:54Z usVexMownCzar member/usVexMownCzar 最近接手了公司一个项目,看了几天,发现一个用 Swift 开发的项目,但是所有的数组,字典类型用的全是 OC 中的类型,NSArrayNSMutableArrayNSDictionaryNSMutableDictionary

每次看到从这些类型中取值、设置值都很头疼(好几年没写 OC 了):

var dict = NSMutableDictionary() dict = NSMutableDictionary(dictionary: te as! NSDictionary) dict.setValue("\((index as! NSDictionary).object(forKey: "foo")!)", forKey: "foo") 

完全不使用 Swift 的语言特性,一些高级函数都无法使用,关键这是一个 Swift 项目。

虽然其中有一些是从 16 年就有的代码,但是最近开发的功能还这么做,就很无语。

就像是用 TypeScript 进行项目开发,但是所有的类型都是 Any

诶,什么时候 Swift 能把 OC 踢出去呀

]]>
期待各位 Swiftor 的加入! tag:www.v2ex.com,2023-04-02:/t/929149 2023-04-02T04:56:49Z 2023-04-01T12:55:49Z shindgewongxj member/shindgewongxj 为了方便讨论 Swift 开发相关的问题,在 Telegeram 上创建了一个群组!
期待各位的加入!
链接

]]>
ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86