有没有更整洁或更好的方法来在 Swift 中编写下面的嵌套 for...in 循环?或者是否使用 for... 以正确的方式填充我的卡片?
for cardNumber in 1...3 {
for cardSymbolIdentifier in 1...3 {
for cardColorIdentifier in 1...3 {
for cardShadingIdentifier in 1...3 {
let card = Card(cardNumber: cardNumber, cardSymbolIdentifier: cardSymbolIdentifier, cardColorIdentifier: cardColorIdentifier, cardShadingIdentifier: cardShadingIdentifier)
deckOfCards.append(card)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它确实可以完成这项工作,但我在文档中找不到有关编写多个嵌套循环的任何内容。
预先非常感谢,安迪
我试图将 a 放在PKCanvasView
图像之上,这与初始布局配合良好,但是当调整视图大小(通过旋转 iPad)时,内部PKDrawing
不会缩放,这会导致图像注释位于不正确的位置。我正在努力弄清楚如何正确缩放PKDrawing
以保留正确的位置。
这是演示该问题的示例:
class ImageDrawingView: UIView {
private let imageView = UIImageView(frame: .zero)
private let drawingView = PKCanvasView(frame: .zero)
private let toolPicker = PKToolPicker()
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
private func commonInit() {
// Setup image view
addSubview(imageView)
imageView.image = UIImage(named: "TestImage") // Here I just used a screen grab of the lock screen
imageView.contentMode = .scaleAspectFill
// Setup drawing view …
Run Code Online (Sandbox Code Playgroud) 我已经在这里看到了许多其他与我类似的问题,但我无法找到我的案例 - 如果我错过了一些明显的问题,我深表歉意!
我有一个“事务”类,其中包含一些属性,所有这些属性都符合 codable 并且可以很好地保存/加载。我刚刚添加了一个字典并收到以下错误:类型“事务”不符合协议“可解码”和“可编码”。
字典是:
var splitTransaction: [String:(amount: Money<GBP>, setByUser: Bool)]? {
Run Code Online (Sandbox Code Playgroud)
Money 来自何处:https : //github.com/Flight-School/Money(Money 已经符合 codable,我还有其他类型为 Money 的属性运行良好。
从https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types我想我必须使用编码密钥来编码/解码 splitTransaction,但这是否意味着我也必须为我的其他每个属性都有一个编码密钥? 然后也提供一种编码/解码它们的方法?或者有没有办法让所有其他属性自动进行编码/解码,而只是为 splitTransaction 提供一种手动工作的方法。
非常感谢任何指导!
我正在尝试将其包装PKCanvasView
为名为 的 SwiftUI 视图CanvasView
。我希望能够将整个画布切换到另一个视图之上。当CanvasView
出现时,我希望PKToolPicker
出现。当它消失时,我希望它PKToolPicker
消失。
我在这里找到了一些类似的方法,但它们只涉及显示选择器或使用按钮切换选择器;我希望选择器可见性与视图可见性相关联。
在下面的示例中,您可以看到可以切换画布,但是一旦工具选择器可见,它就会保持可见。
这是我的CanvasView
:
import SwiftUI
import PencilKit
struct CanvasView: UIViewRepresentable {
class Coordinator: NSObject, PKCanvasViewDelegate {
var canvasView: Binding<PKCanvasView>
let onChange: () -> Void
init(canvasView: Binding<PKCanvasView>, onChange: @escaping () -> Void) {
self.canvasView = canvasView
self.onChange = onChange
}
func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
if canvasView.drawing.bounds.isEmpty == false {
onChange()
}
}
}
@Binding var canvasView: PKCanvasView
@Binding var toolPickerIsActive: Bool
private let toolPicker …
Run Code Online (Sandbox Code Playgroud) 我有 SwiftUI 中的 URL 列表。当我点击某个项目时,我会呈现一个全屏视频播放器。我有一个@EnvironmentObject
可以处理一些查看器选项(例如,是否显示时间码)。我还有一个显示和隐藏时间码的切换开关(我只在本例中包含了该切换开关,因为时间码视图并不重要),但每次我更改切换开关时,都会再次创建视图,从而重新设置AVPlayer
. 这是有道理的,因为我是在视图的初始化程序中创建播放器的。
我考虑过创建自己的ObserveredObject
类来包含 ,AVPlayer
但我不确定如何或在哪里初始化它,因为我需要给它一个 URL,而我只能从CustomPlayerView
. 我还考虑过将播放器设置为 ,@EnvironmentObject
但初始化我可能不需要的东西似乎很奇怪(如果用户没有点击 URL 来启动播放器)。
AVPlayer
创建 AVKit 的正确方法是什么VideoPlayer
?这是我的示例代码:
class ViewerOptions: ObservableObject {
@Published var showTimecode = false
}
struct CustomPlayerView: View {
@EnvironmentObject var viewerOptions: ViewerOptions
private let avPlayer: AVPlayer
init(url: URL) {
avPlayer = AVPlayer(url: url)
}
var body: some View {
HStack {
VideoPlayer(player: avPlayer)
Toggle(isOn: $viewerOptions.showTimecode) { Text("Show Timecode") }
}
}
}
Run Code Online (Sandbox Code Playgroud) swift ×3
ios ×2
pencilkit ×2
swiftui ×2
avfoundation ×1
avkit ×1
codable ×1
dictionary ×1
for-in-loop ×1