我如何在 Swift 5 中使用协议函数参数使用关联类型的协议(即 .pickerStyle())

埃姆威

我正在使用 SwiftUI 并希望根据选择器中的项目数量设置视图的选择器样式。对于一些项目,SegmentedPickerStyle() 是理想的,WheelPickerStyle() 越多越好。

}.pickerStyle(productsObserver.product.productFamilies?.count ?? 0 < 5 ? SegmentedPickerStyle() : WheelPickerStyle())

函数签名读作:func pickerStyle<S>(_ style: S) -> some View where S : PickerStyle我学到的在函数签名中使用泛型,因为 PickerStyle 使用关联类型。

它不应该是一个那么困难的问题,可能也不是 - 协议应该像这样简单的 = 一样工作,但我看不到它。任何帮助表示高度赞赏!

新开发

pickerStyle是一种通用方法,它接受符合 的具体类型(在编译时)PickerStyle因此,它不能是SegmentedPickerStyleWheelPickerStyle(在运行时确定) - 它必须是一个或另一个。

因此,一个建议是创建一个视图修改器并有条件地应用选择器样式。这里的关键区别在于它返回 type 的条件视图_ConditionalContent<TrueContent, FalseContent>

struct PickerStyleOption<P1: PickerStyle, P2: PickerStyle>: ViewModifier {
    let predicate: () -> Bool
    let style1: P1
    let style2: P2
    
    @ViewBuilder
    func body(content: Content) -> some View {
        if predicate() {
            content
                .pickerStyle(style1)
        } else {
            content
                .pickerStyle(style2)
        }
    }
}

为方便起见,您可以创建一个扩展:

extension View {
    func pickerStyleOption<P1: PickerStyle, P2: PickerStyle>(
            _ condition: @autoclosure @escaping () -> Bool,
            then style1: P1, 
            else style2: P2) -> some View {

        self.modifier(
            PickerStyleOption(predicate: condition, style1: style1, style2: style2)
        )
    }
}

并像这样使用它:

Picker(...) {
   ...
}
.pickerStyleOption((productsObserver.product.productFamilies?.count ?? 0) < 5, 
   then: SegmentedPickerStyle(), else: WheelPickerStyle())

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Swift中使用带有关联类型的协议关闭时使用Void类型

如何在通用函数中使用Swift通用Decodable协议

如何使用协议关联类型在Swift中编写泛型函数

如何在Swift中将具有关联类型的协议(通用协议)作为参数传递?

Swift协议可选函数中如何使用枚举作为参数

如何在使用关联类型的协议中使用类型擦除

如何在Swift 3中使用关联类型的参数调用泛型函数

使用关联类型作为参数类型的Swift协议

我可以在协议中使用@IBOutlets(Swift)

在Swift中,如何在协议扩展中使用通用枚举类型?

我们如何在swift中使用协议实现并发线程?

如何在 Objective-C 中使用 swift 协议实现?

如何在Swift中的函数内部使用协议?

如何在swift 5中使用闭包在参数中传递函数

使用关联类型和Self的Swift协议?

如何在Swift中使用具有相同协议变量的多个协议?

使用泛型类型时,如何使用默认参数扩展 Swift 协议?

如何在Swift中对SKPSMTPMessageDelegate使用协议?

为什么 Swift 不允许在采用协议的参数中使用符合协议的类型?

为什么我不能在Swift中使用let in协议?

我无法在 swift 中使用协议传递数据

如何在Swift中使用约束为泛型类型和协议的属性来初始化类

在Swift中使用协议时的类型转换

在 Swift 中使用协议类型投射异常

如何使用2个Swift协议创建观察者模式,其中两个关联类型必须相同?

我该如何写一个简单的示例,说明如何在Swift 5中使用委托

如何使swift类符合某个协议,而该协议的属性之一要求使用符合协议的类型?

swift 如何确定子协议中的关联类型

我如何在 swift 5 中使用两个 UIDatePickers 获取和显示两次之间的差异