我有一个包含交易类别的类(请参阅下面的示例代码),用户可以在设置过程中从中选择一个子集以在应用程序中使用。稍后在事务输入期间,如果未选择类中的第一个类别(在设置期间)并且选择器状态参数初始化为零,我会看到控制台消息“选择器:选择“0”无效并且没有关联的标签,这将给出未定义的结果”。事实上,如果状态参数初始化为 5 并且在设置过程中未选择第 5 个类别,它也会给出相同的警告。
我的问题是如何初始化状态参数,这样我就不会收到此选择器警告?
从控制台消息中我认为问题出在 ForEach 循环而不是条件。但如果删除条件if categories.catItem[item].catInUse == true {,我就看不到警告。
例如,在下面的代码中,如果在应用程序设置期间未选择类别Cat A(catInUse 为 false)并且交易条目选择器状态参数为,
@State private var entryCat: Int = 0我将看到上面的控制台警告消息。类别Cat A仍然在列表中 - 只是没有显示。
struct getCategory: View {
@EnvironmentObject var categories: Categories
@State private var entryCat: Int = 0
var body: some View {
Section(header: Text("Select Category")) {
Picker(selection: $entryCat, label: Text("")) {
ForEach(0 ..< categories.catItem.count, id: \.self) { item in
if categories.catItem[item].catInUse == true {
Text(categories.catItem[item].catName)
.bold()
} …Run Code Online (Sandbox Code Playgroud) 如何在 Swift 中的 Task 修饰符中调用 defer ?我想延迟执行清理操作。这包括将loadingState设置为.idle并将selectedImage设置为nil等。无论是否抛出异常,延迟代码都应该触发。
Task {
do {
defer {
print("DEFER")
self.selectedImage = nil
loadingState = .idle
chatText = ""
}
try await sendMessage()
print("")
} catch {
print(error.localizedDescription)
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下编译错误:
主要参与者隔离的属性“loadingState”不能从主要参与者发生突变
任何帮助表示赞赏。
更新:
Task { @MainActor in
do {
defer {
print("DEFER")
loadingState = .idle
self.selectedImage = nil
loadingState = .idle
chatText = ""
}
try await sendMessage()
} catch {
print(error.localizedDescription)
}
}
Run Code Online (Sandbox Code Playgroud)
更新2
这是产生类似错误的最少代码:
enum SampleError: Error {
case operationFailed
}
func doSomething() …Run Code Online (Sandbox Code Playgroud) 我正在尝试更新 SwiftData 中的数据。然而,该文档实际上只是:
func update(expressions: [String : NSExpression],
model: any PersistentModel.Type,
where predicate: NSPredicate? = nil) throws -> Bool
Run Code Online (Sandbox Code Playgroud)
作为一名新开发人员,我不知道其中大部分意味着什么或如何使用它。我的代码如下:
try? context.update(expressions ["teamScores":NSExpression(format: "\(teamScores)")], model: CounterModel.self)
Run Code Online (Sandbox Code Playgroud)
它失败了exception of type NSException。
老实说,我没能尝试太多。截至撰写本文时,这样一个新框架实际上已经在 6 天前发布,除了设置模型、保存数据和查询数据库之外,没有太多文档或示例。
我正在测试新的 SwifData 框架并使用新的 #Predicate 宏,并意识到它不支持不区分大小写的搜索。该宏不能与 lowercased() 方法或 localizedLowercase 属性一起使用,因此似乎无法像我们过去使用 NSPredicate 和 [c] 属性那样创建不区分大小写的谓词。
var predicate = #Predicate<Book> {
$0.title.localized().contains(search) }
Run Code Online (Sandbox Code Playgroud)
错误:此谓词不支持 lowercased() 函数(来自宏“Predicate”)
我想知道是否有任何解决办法。谢谢
我正在使用新的 swiftData 我试图理解这些关系是如何工作的,我很高兴必须对类进行建模:
我的应用程序上的每个航班都包含许多机组人员,我编写了如下代码所示的关系,但不断收到错误“致命错误:反向关系不存在”
我们应该如何写这个关系:
@Model
class Flight {
@Attribute(.unique) var flightID: UUID
var typeOfFlight: String
var flightDateUTC : Date
var flightNumber: String?
@Relationship(.cascade) var flightData: FlightData
@Relationship(.cascade) var flightTime : FlightTime
@Relationship(.noAction) var aircraft : Aircraft?
@Relationship(inverse: \CrewModel.name)
var crews : [CrewModel]? //<-------------------------------
init(flightID: UUID, typeOfFlight: String, flightDateUTC: Date, flightNumber: String? = nil, flightData: FlightData, flightTime: FlightTime, aircraft: Aircraft? = nil, crews: [CrewModel]? = nil) {
self.flightID = flightID
self.typeOfFlight = typeOfFlight
self.flightDateUTC = flightDateUTC
self.flightNumber = flightNumber
self.flightData …Run Code Online (Sandbox Code Playgroud) 我正在尝试打开模拟器,以便模拟 Flutter 应用程序。但是,我的模拟器遇到了问题。当我尝试打开它(我使用它open -a Simulator)时,模拟器永远不会打开。当我尝试在菜单栏中创建新模拟器时,单击“新模拟器”选项卡上的“下一步”不会执行任何操作。另外,我不确定这是否相关,但在“新模拟器”选项卡中,有模拟器名称、设备类型和操作系统版本,我无法选择操作系统版本,它只是空白,没有其他选择。
我尝试过重新启动计算机、更新计算机并重新安装 Xcode。还安装/重新安装了命令行工具。
以下是更多信息:
macOS 版本:macOS 14.0 (23A344)
Xcode 版本:Xcode 15.0 构建版本 15A240d
模拟器版本:版本15.0 (1015.2) SimulatorKit 935.1 CoreSimulator 920.6
有谁知道可能是什么原因导致这个问题?
如果我在任何地方(Xcode Simulator、Playground 等)使用以下Swift Charts ,它会挂起或崩溃。 Chart一旦我删除chartXVisibleDomain修改器,一切都会正常。还有其他人遇到同样的问题和/或知道如何解决它吗?我使用的是 Xcode 版本 15.0 (15A240d)。
import SwiftUI
import Charts
struct ContentView: View {
let data: [(day: Date, value: Int)] = [
(Calendar.current.date(byAdding: .day, value: 0, to: .now)!, 1),
(Calendar.current.date(byAdding: .day, value: -1, to: .now)!, 2),
(Calendar.current.date(byAdding: .day, value: -3, to: .now)!, 3),
(Calendar.current.date(byAdding: .day, value: -10, to: .now)!, 4),
(Calendar.current.date(byAdding: .day, value: -20, to: .now)!, 5)
]
var body: some View {
Chart(data, id: \.day) { (day, value) in
BarMark(
x: …Run Code Online (Sandbox Code Playgroud) 我想知道如何才能复制一份NSMutableAttributedString. 我有一个名为的属性text,我想在某个时刻保存其内容并在发生某些情况时恢复到它。我尝试创建一个名为textCopywhere 我可以将其保存到的属性@property (nonatomic, copy),但是当我这样做时出现运行时错误:
-[NSConcreteAttributedString insertAttributedString:atIndex:]:发送到实例的无法识别的选择器。
我将如何实现这个目标?
每当我将 设为 时,我都会收到此NSMutableAttributedString消息@property (nonatomic, copy)。我不明白为什么这行不通。NSMutableAttributedString一般来说,无论我是否使用它的 setter 方法,复制参数似乎都不起作用。
在具有以下 Swift 代码的 Xcode Playground 中,我得到了带注释的输出。给定 MST TimeZone 对象和该 MST TimeZone 的 MDT TimeZone 中的日期,我没有收到预期的 MDT TimeZone 缩写输出。我对此函数不了解什么,以及如何获得所需的输出,以找出给定日期在给定当前示例 MST 时区的两个可能时区中的哪一个?
// Daylight saving time (MDT) 2021 in Colorado began at 2:00 AM on Sunday, March 14
let mstDate = Date(timeIntervalSinceReferenceDate: 636327068) // "Mar 1, 2021 at 2:31 PM"
let mdtDate = Date(timeIntervalSinceReferenceDate: 637709468) // "Mar 17, 2021 at 3:31 PM"
let mstTimeZone = TimeZone(abbreviation: "MST")!
let mdtTimeZone = TimeZone(abbreviation: "MDT")!
mstTimeZone.abbreviation(for: mstDate) // expected MST, got MST
mstTimeZone.abbreviation(for: mdtDate) // …Run Code Online (Sandbox Code Playgroud) swift ×7
swift-data ×3
swiftui ×3
date ×1
flutter ×1
ios ×1
ios17 ×1
objective-c ×1
predicate ×1
storyboard ×1
timezone ×1
uilabel ×1
xcode ×1