新的SwiftUI教程具有以下代码:
struct ContentView: View {
var body: some View {
Text("Hello World")
}
}
Run Code Online (Sandbox Code Playgroud)
第二行单词some和在其网站上被高亮显示,就像它是一个关键字一样。
Swift 5.1似乎没有some作为关键字,而且我也看不出该词some还有什么其他用处,因为它可以到达类型通常所处的位置。是否有Swift的未发布新版本?以某种我不知道的方式在类型上使用的函数吗?
关键字有some什么作用?
在 SwiftUI 中,经常需要根据某些条件显示“空”视图,例如:
struct OptionalText: View {
let text: String?
var body: some View {
guard let text = text else { return }
return Text(text)
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并不编译自体guard必须返回一些观点,那就是当一个“空”的观点text是nil。如何把这个例子被重写,使其和编译时会生成一个“空”的看法text是nil?
Assume I have a View with an Image that has a shadow property:
struct ContentView: View {
var body: some View {
Image("turtlerock").shadow(radius: 10)
}
}
Run Code Online (Sandbox Code Playgroud)
Now imagine I want to access the value of the shadow radius. I assumed I could do this:
struct ContentView: View {
var body: some View {
let myImage = Image("turtlerock").shadow(radius: 10)
print(myImage.modifier.radius)
}
}
Run Code Online (Sandbox Code Playgroud)
However, this returns an error:
Function declares an opaque return type, but has no return statements in its body …
我知道SwiftUI目前不支持常规的for循环,而是提供了一个称为ForEach的东西,但是和List之间有什么区别?
我正在尝试找出正确的方法来有条件地包含swiftui视图。我无法直接在视图内部使用if,而不得不使用堆栈视图来做到这一点。
这可行,但似乎会有更清洁的方法。
var body: some View {
HStack() {
if keychain.get("api-key") != nil {
TabView()
} else {
LoginView()
}
}
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我知道
body是一个只有get一部分的计算属性。return 省略 VStack但是{ .. }Vstack 之后是什么?这是初始化还是闭包?{} 里面有什么,我认为没有任何回报。
struct ContentView: View {
var body: some View {
VStack {
MapView()
.frame(height: 300)
CircleImage()
.offset(y: -130)
.padding(.bottom, -130)
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack(alignment: .top) {
Text("Joshua Tree National Park")
.font(.subheadline)
Spacer()
Text("California")
.font(.subheadline)
}
}
.padding()
Spacer()
}
}
}
Run Code Online (Sandbox Code Playgroud) 我很好奇您是否可以在 SwiftUI 中创建自定义容器视图。我知道您可以创建自定义内容视图,例如Text(),但不确定是否可以复制 say 的功能HStack { }
类似于:
HGrid {
Text("Lorem ipsum")
Text("Lorem ipsum")
}
Run Code Online (Sandbox Code Playgroud)
HGrid然后,自定义容器视图(又名)将Spacer()在每个添加的组件之间添加。本质上,例如,将其转换为:
HStack {
Text("Lorem ipsum")
Spacer()
Text("Lorem ipsum")
}
Run Code Online (Sandbox Code Playgroud) SwiftUI中的某些视图(例如VStack和HStack)支持将多个视图作为子视图,如下所示:
VStack {
Text("hello")
Text("world")
}
Run Code Online (Sandbox Code Playgroud)
从我收集,他们使用ViewBuilder使之成为可能的解释在这里。
我们如何使用@ViewBuilder创建自己的支持多个子视图的视图?例如,假设我要创建一个Layout接受任意子级的View,如下所示:
struct Layout : View {
let content: Some View
var body : some View {
VStack {
Text("This is a layout")
content()
}
}
}
Run Code Online (Sandbox Code Playgroud)
知道如何在SwiftUI中实现此模式吗?
我有两个文本字段,用于更改两个 @State 变量(即startingMileage 和endingMileage)的值,以及一个步进器,用于更改名为fuelAdded 的第三个@State 变量的值。我正在尝试使用用户的输入并进行计算来计算每加仑的英里数。在操场上,我的代码按预期工作。但是,它在 SwiftUI 项目中不起作用。
尝试在操场上运行代码如下:
func CalcMPG(start: String, end: String, fuel: Double) -> Int {
let start = Int(start) ?? 1
let end = Int(end) ?? 1
let fuel = Int(fuel)
let mpg = (end-start) / fuel
return mpg
}
var endingMileage:String = "9250"
var startingMileage:String = "9000"
var fuelAdded:Double = 20
let milesPerGallon = CalcMPG(start: startingMileage, end: endingMileage, fuel: fuelAdded)
print("Fuel Efficiency: \(milesPerGallon) mpg")
Run Code Online (Sandbox Code Playgroud)
这按预期工作。
struct ContentView : View {
@State var startingMileage: String = …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用Swift UI为iOS 13创建一个应用程序,但我不断收到这个奇怪的错误:“对成员'buildBlock()'的引用不明确”。
无论我做什么,错误都不会消失。
我尝试一次注释部分代码,以查看可能是引起问题的部分,但是唯一起作用的是注释掉整个视图。
我试过清理构建文件夹并删除派生数据。我还尝试过多次重启计算机和Xcode,但没有任何修复措施。
我很确定这只是一个Xcode错误,但是必须解决它,如果有人能告诉我那是什么,我将非常感谢。
var body: some View {
GeometryReader { geometry in {
VStack {
Button (action: self.editProfilePicture) {
Image(ImageNames.AccountIconImageName, bundle: Bundle.main)
.resizable()
.frame(width: geometry.size.width / SizeConstants.AccountIconSizeDiviser, height: geometry.size.width / SizeConstants.AccountIconSizeDiviser)
.padding()
.background(ColorConstants.VeryLightGrayColor)
.clipShape(Circle())
}
.accentColor(.white)
.padding(.bottom, LargePadding)
ScrollView (showsVerticalIndicator: false) {
let const: Length? = geometry.size.width - SizeConstants.FullNameTextFieldWidthReduction
TextBox(textBinding: self.$fullName, placeHolder: Text(Strings.FullNameString), editChanged: self.fullNameChanged)/*.padding(.bottom, SmallPadding)*/.frame(width: const)
TextBox(textBinding: self.$username, placeHolder: Text(Strings.UsernameString), editChanged: self.usernameChanged)//.padding(.bottom)
Text(verbatim: Strings.ChooseIdType).font(.footnote).color(.gray)
TextBox(textBinding: self.$phoneNumber, placeHolder: Text(Strings.PhoneNumberString), editChanged: self.phoneNumberChanged)//.padding(.bottom, SmallPadding)
TextBox(textBinding: self.$emailAddress, placeHolder: Text(Strings.EmailAddressString), …Run Code Online (Sandbox Code Playgroud) 我经常看到这样的代码:
VStack {
Text("A")
Text("B")
}
Run Code Online (Sandbox Code Playgroud)
通过查看 swift 教程,我知道这是将闭包指定为函数的最后一个参数的简写。但是,afaik 如果return没有指定关键字,闭包将隐式返回内部表达式的结果。
在这种情况下,有两个Text对象。它们是作为元组还是列表返回?我知道它有效,但我不清楚,关闭返回的到底是什么。