小编ADB*_*ADB的帖子

在 Swift 中编写多个嵌套的 for...in 循环

有没有更整洁或更好的方法来在 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)

它确实可以完成这项工作,但我在文档中找不到有关编写多个嵌套循环的任何内容。

预先非常感谢,安迪

for-in-loop swift

7
推荐指数
1
解决办法
5323
查看次数

当布局更改时如何正确调整 PKDrawing 的大小?

我试图将 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)

ios swift pencilkit

6
推荐指数
0
解决办法
414
查看次数

如何使包含元组的字典符合可编码?

我已经在这里看到了许多其他与我类似的问题,但我无法找到我的案例 - 如果我错过了一些明显的问题,我深表歉意!

我有一个“事务”类,其中包含一些属性,所有这些属性都符合 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 提供一种手动工作的方法。

非常感谢任何指导!

dictionary swift codable

5
推荐指数
1
解决办法
1444
查看次数

当视图在 SwiftUI 中消失时如何关闭 PKToolPicker?

我正在尝试将其包装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 pencilkit

4
推荐指数
1
解决办法
1561
查看次数

如何在 SwiftUI 中管理 AVPlayer 状态

我有 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)

avfoundation ios avkit swiftui

3
推荐指数
1
解决办法
3128
查看次数