我尝试了在 SwiftUI 视图中更新 @State 的不同方法。在某些方法中,状态更改会更新相关视图,而在某些方法中则不会。
@State var bodyText: String = "Hello swift"
var body: some View {
Text(bodyText)
.onAppear(perform: triggerTextUpdate)
}
private func triggerTextUpdate() {
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
bodyText = "Hello I am future swift"
}
}
Run Code Online (Sandbox Code Playgroud)
1.@State从初始化器改变
@State var bodyText: String = "Hello swift"
init() {
triggerTextUpdate()
}
var body: some View {
Text(bodyText)
}
private func triggerTextUpdate() {
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
bodyText = "Hello I am future swift"
}
}
Run Code Online (Sandbox Code Playgroud)
2.@State由变异函数改变
@State var bodyText: String …Run Code Online (Sandbox Code Playgroud) 标题可能不足以概述问题上下文。所以这里是描述:
SWIFT 编译过程 Swift 编译器经过以下步骤来编译 Swift 文件
根据苹果公司的说法,
IR生成(在lib/IRGen中实现)将SIL降低为LLVM IR,此时LLVM可以继续优化它并生成机器代码。
查询号 1 - 我们都知道编译器将我们的源代码转换为汇编语言,而汇编器(主要嵌入在操作系统中,至少 Swift 编译器中没有汇编器)将其转换为机器代码。因此,根据上面引用的语句,编译器中的 LLVM 将 LLVM IR 更改为机器代码。那么如果是这种情况,那么汇编器在 Swift 程序和执行中就没有任何作用了?
查询号 2 - Swift 中的 LLVM 将 LLVM IR 直接更改为机器代码。这意味着我编译的可执行二进制文件具有机器代码,而不是汇编代码。根据我的理解,机器代码不需要像汇编语言那样的任何特定的调用约定,而 ABI 就是关于调用约定、内存布局表示等,通过它们定义两个二进制文件之间的通信。那么,由于二进制可执行文件已经具有机器代码,ABI 会出现在哪里呢?
那么,是我遗漏了一些东西,还是苹果让它变得非常抽象?
设想:
我想要不同类型的债券,它们具有最小值、灵活利息当前债券价值(根据某些逻辑计算)和债券增长预测。
每当债券价值超过最小值时,增长预测就会升值和贬值,反之亦然。
我正在尝试使用相同的属性包装器,以便我不会为每个键复制相同的行为:
@propertyWrapper
struct BondValue {
private var bondCurrentWorth: Int
private var minimumValue: Int
private var flexiInterest: Int
var projectedValue: BondGrowth = .appreciating // The projected value projects the growth for the bond
var wrappedValue: Int {
get {
return bondCurrentWorth
}
set {
bondCurrentWorth = newValue + (newValue * flexiInterest/100)
projectedValue = bondCurrentWorth < minimumValue ? .depriciating : .appreciating
}
}
init(wrappedValue: Int = 0, minimumValue: Int, flexiInterest: Int, value: Int) {
self.minimumValue = minimumValue
self.flexiInterest …Run Code Online (Sandbox Code Playgroud) 我最近阅读了一个关于视图的框架和边界属性的精彩问题 - UIView frame, bounds and center。我也尝试使用自动布局对此进行更多实验,现在我发现自己处于一个非常矛盾的场景中。请耐心等待,因为这可能需要一点时间。
我会一一强调它们,所以请帮助我克服所有这些 -
我拥有的?——
带有约束的视图层次结构如下 - (设计是在默认的 ViewController 大小为 600*600 上完成的)
我试图打印出这些视图的框架和边界 -
内容视图
print(contentView.frame)// o/p - (0.0, 64.0, 600.0, 536.0)
print(contentView.bounds)//o/p- (0.0, 0.0, 600.0, 536.0)
Run Code Online (Sandbox Code Playgroud)
Q) **a)**为什么无论我运行哪个屏幕,帧大小都显示为 600*536。例如。如果我在 4s 屏幕或 iPad 屏幕上运行它,它的打印结果是一样的吗?
**b)**它总是在我的故事板中推断出我的 VC 的大小!!。例如。如果我在 3.5 英寸 VC 中设计屏幕,则框架尺寸变为 320.0*416.0。
**c)**因为它固定到视图的所有边,所以它应该与视图大小相同,并且它始终保持固定到边缘。那么为什么它的大小不一样self.view.frame.width*self.view.frame.height
侧面图
print(sideView.frame)//o/p - (520.0, 86.0, 80.0, 128.0)
print(sideView.bounds)//o/p - (0,0, 80.0, 128.0)
Run Code Online (Sandbox Code Playgroud)
问)如果我以编程方式设计自定义 UIView
let TestView = UIView(frame: CGRectMake(520.0, 86.0, 80.0, 128.0))//Mark:its frame is exactly same as sideView.frame
TestView.backgroundColor …Run Code Online (Sandbox Code Playgroud) 关于可选绑定,全局变量以及包装和展开,我有一些非常简单的疑问.由于我是SWIFT的新手,因此了解其概念的山雀和部分非常重要.
1)在Swift中,如果我声明一个全局变量,我有两个选项可以使它成为可选或非可选,所以让我有2-4个或更多的可选变量.所以可取的是绑定所有这些变量
viewDidLoad() method// so that I could use them without any problem of unwrapping and fatal error in my program.
Run Code Online (Sandbox Code Playgroud)
2)让我通过以下示例让自己更清楚 - 我的项目VC1和VC2中有2个VC.VC2有一个文本字段,用户在其中输入一些值并在VC1的tabelview中显示.
在Vc1
var namevc1 = NSMutableArray?//holds the input of textfield to be passed from VC2.
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我的VC1是第一个在我的项目运行时加载的视图控制器,我使用一个可选变量来填充我的tabke vuew
'arr'
Run Code Online (Sandbox Code Playgroud)
所以当应用程序第一次运行时它是空的.因此,在代码中使用其值时可能会导致致命错误.那么它的解决方案是什么解决方案呢?
viewDidLoad()
Run Code Online (Sandbox Code Playgroud)
方法或全部声明一个空的NSMutable数组类型来代替可选类型.
提前致谢.