我正在开发一个采用 MVVM 模式的 iOS 应用程序,使用 SwiftUI 设计视图和 Swift 组合,以便将我的视图与其各自的视图模型粘合在一起。在我的ViewModels之一,我已经创建了一个Publisher(类型Void为按下一个按钮,另一个用于A的含量)TextField(类型String)。我希望能够在我的 ViewModel 中组合两个发布者,这样组合的发布者仅在按钮发布者发出事件时才发出事件,同时从字符串发布者获取最新事件,因此我可以对TextField数据进行某种评估, 每次用户按下按钮时。所以我的虚拟机看起来像这样:
import Combine
import Foundation
public class MyViewModel: ObservableObject {
@Published var textFieldContent: String? = nil
@Published var buttonPressed: ()
init() {
// Combine `$textFieldContent` and `$buttonPressed` for evaulation of textFieldContent upon every button press...
}
}
Run Code Online (Sandbox Code Playgroud)
两个发布者都通过 SwiftUI 获取数据,所以我将省略那部分,让我们假设两个发布者都随着时间的推移收到一些数据。
来自 RxSwift 框架,我的 goto 解决方案是使用withLatestFrom运算符来组合两个可观察对象。然而,在“组合来自多个出版商的元素”一节中深入研究出版商的 Apple 文档,我找不到类似的东西,所以我希望目前缺少这种运算符。
所以我的问题是:是否有可能使用结合框架的现有运算符 API 来最终获得相同的行为withLatestFrom?
我正在使用 SwiftUI 并且我想在我的应用程序中出于演示目的在视图出现时立即为其设置动画(动画的显式类型无关紧要)。假设我只想放大我的视图,然后再次将其缩小到其原始大小,我需要能够将视图动画化为新状态,然后立即返回到原始状态。这是我迄今为止尝试过的示例代码:
import SwiftUI
import Combine
struct ContentView: View {
@State private var shouldAnimate = false
private var scalingFactor: CGFloat = 2
var body: some View {
Text("hello world")
.scaleEffect(self.shouldAnimate ? self.scalingFactor : 1)
.onAppear {
let animation = Animation.spring().repeatCount(1, autoreverses: true)
withAnimation(animation) {
self.shouldAnimate.toggle()
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,这并不能完全满足我的要求,因为let animation = Animation.spring().repeatCount(1, autoreverses: true)仅通过使用平滑autoreverse = true设置来确保动画(到新状态)正在重复,这仍然会导致视图缩放到 的最终状态scalingFactor。
所以我也找不到任何animation可以让我的动画自动反转回原始状态的属性(在第一个动画之后我不必与视图交互),我也没有找到任何关于如何确定第一个动画的时间居然完成了,才能触发新的动画。
我发现在某些视图的外观上设置动画是很常见的做法,例如只是为了展示该视图可以与之交互,但最终不会改变视图的状态。例如,为按钮上的反弹效果设置动画,最终将按钮设置回其原始状态。当然,我找到了几种建议与按钮交互以触发反向动画返回其原始状态的解决方案,但这不是我想要的。
我有一个 Swift 应用程序,它实现了 Auth0 的网络登录。成功登录后,我会收到一个访问令牌和idToken,它们都本地存储在我的钥匙串中。下次登录时,我首先检查访问令牌(存储在钥匙串中)是否仍然有效
Auth0
.authentication()
.userInfo(withAccessToken: accessToken)
.start { result in
switch result {
case .success(result: let profile):
print("access token still valid")
Run Code Online (Sandbox Code Playgroud)
成功后不必再次登录。然而,我遇到的问题是,即使我的访问令牌仍然有效,我的 idToken 可能已经过期,这会导致在我使用此 idToken 请求我的(GraphQL)后端时出错。那么我该如何解决这个问题?有没有办法检查我的 idToken 在 Swift 中是否已过期?因为如果没有办法检查,我将不得不要求登录,即使令牌可能没有过期。那没有意义。
我的目标是在 C 中为二维 int 数组动态重新分配内存。我知道已经有几个关于该主题的问题,但不幸的是我的代码无法正常运行,我不知道出了什么问题。
首先我分配内存:
int n = 10;
int m = 4;
int** twoDimArray;
twoDimArray = (int**)malloc(n * sizeof(int*));
for(int i = 0; i < n; i++) {
twoDimArray[i] = (int*)malloc(m * sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)
并用整数初始化数组:
for(int i = 0; i < n; i++) {
for(j = 0; j < 4; j++) {
twoDimArray[i][j] = i * j;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我用来realloc()动态重新分配内存:
int plus = 10;
int newArraySize = n + plus;
twoDimArray = (int**)realloc(twoDimArray, newArraySize * sizeof(int)); …Run Code Online (Sandbox Code Playgroud)