我正在尝试使用Swift 4.2+通过Int.random()函数生成带种子的随机数,但是没有给定的实现允许带给随机数生成器的实现。据我所知,唯一的方法就是创建一个新的符合RandomNumberGenerator协议的随机数生成器。是否有人建议采用更好的方法,或者是否有符合RandomNumberGenerator的类且具有播种功能的实现,以及如何实现?
另外,在寻找解决方案时,我看到了两个函数srand并drand提到了几次,但是从提到它的频率来看,我不确定使用它是否不好,而且我也找不到关于它们的任何文档。
我正在寻找最简单的解决方案,不一定是最安全或最快的性能解决方案(例如,使用外部库并不理想)。
更新: “播种”是指我将种子传递给随机数生成器,以便如果我将同一种子传递给两个不同的设备或在两个不同的时间传递,则生成器将产生相同的数字。目的是我为应用程序随机生成数据,而不是将所有数据保存到数据库中,而是想保存种子,并在每次用户加载应用程序时使用该种子重新生成数据。
Is there a way to iterate through a Dictionary in a ForEach loop? Xcode says
Generic struct 'ForEach' requires that '[String : Int]' conform to 'RandomAccessCollection'
so is there a way to make Swift Dictionaries conform to RandomAccessCollection, or is that not possible because Dictionaries are unordered?
One thing I've tried is iterating the dictionary's keys:
let dict: [String: Int] = ["test1": 1, "test2": 2, "test3": 3]
...
ForEach(dict.keys) {...}
Run Code Online (Sandbox Code Playgroud)
But keys is not an array of Strings, …
你如何组合多个状态变量来形成另一个?
我想通过一些用户交互来更改高度或宽度的值,并相应地更新视图中的所有内容。所以高度或宽度会改变,面积也会改变。
我想它看起来像这样
@State var width: CGFloat = 50.0
@State var height: CGFloat = 100.0
@State var area: CGFloat // somehow equal to width*height
Run Code Online (Sandbox Code Playgroud)
当前的解决方案只是调用一个函数
func area() -> CGFloat {
width * height
}
Run Code Online (Sandbox Code Playgroud) 我NavigationView的NavigationButton内部有一个,但是即使导航栏被隐藏,我也无法使NavigationButton位于屏幕顶部并且仍然能够被按下。
这段代码:
struct ContentView : View {
var body: some View {
NavigationView {
VStack {
NavigationButton(destination: Text("Button Clicked")) {
Text("Hello World")
.background(Color.yellow)
}
Spacer()
}
}
.navigationBarHidden(true)
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试在VStack(的顶部)添加一个负距填充.padding([.top], -95),并且在视觉上起作用,但是后来我无法通过点击按钮来与按钮进行交互(我认为它位于隐藏的导航栏的后面)。将VStacks 设置zIndex为10000即可解决此问题,但仍然无法正常工作。我是否可以将按钮移至顶部,同时仍要确保在点击按钮时可以识别该按钮?
我正在观看WDDC会话237视频,并看到了一个有趣的示例,该示例使用SwiftUI使用渐变和形状创建“色轮”式圆圈,因此我尝试在代码中复制它,但没有得到相同的结果。
这是代码:
let spectrum = Gradient(colors: [.red, .yellow, .green, .blue, .purple, .red])
let conic = AngularGradient(gradient: spectrum, center: .center, angle: Angle(degrees: -90))
return Circle().fill(conic)
Run Code Online (Sandbox Code Playgroud)
但是它居中于底部附近,而不是圆心。另一方面,在Ellipse和上执行示例相同的操作Capsule可以按预期进行:
椭圆:
let spectrum = Gradient(colors: [.red, .yellow, .green, .blue, .purple, .red])
let conic = AngularGradient(gradient: spectrum, center: .center, angle: Angle(degrees: -90))
return Ellipse().fill(conic)
Run Code Online (Sandbox Code Playgroud)
胶囊:
let spectrum = Gradient(colors: [.red, .yellow, .green, .blue, .purple, .red])
let conic = AngularGradient(gradient: spectrum, center: .center, angle: Angle(degrees: -90))
return Capsule().fill(conic)
Run Code Online (Sandbox Code Playgroud)
以下是其中三个外观的图片:
这是错误还是我错过了什么?
SwiftUI对于要符合 的类BindableObject,它必须有一个发布者,通常是didChange,在我迄今为止看到的所有 SwiftUI 文档和视频中,它是一个PassthroughSubject.
例如,如果您有一个名为 的类TestObject,didChange则可能等于PassthroughSubject<TestObject, Never>()。我知道第一种类型是传递的数据类型PassthroughSubject,但是什么是Never?它的目的是什么?是否有第二种类型不适用的场景Never?
swift ×5
swiftui ×5
combine ×1
dictionary ×1
gradient ×1
ios ×1
random ×1
random-seed ×1
swift4.2 ×1
xcode11 ×1