在 Xcode11 Beta 4 中将 String(format: , args) 与 SwiftUI 一起使用时出错

Posted

技术标签:

【中文标题】在 Xcode11 Beta 4 中将 String(format: , args) 与 SwiftUI 一起使用时出错【英文标题】:Error using String(format: , args) with SwiftUI in Xcode11 Beta 4 【发布时间】:2019-07-18 02:19:46 【问题描述】:

升级到 Xcode 11 Beta 4 后,我在使用 String(format: , args)@State 属性时开始看到错误。请参阅下面的代码。第二个Text 行抛出错误:

表达式类型“字符串”在没有更多上下文的情况下是模棱两可的

虽然Texts 1、3 和 4 工作得很好。

struct ContentView : View 
    @State var selection = 2

    var body: some View 
        VStack 
            Text("My selection \(selection)") // works
            Text("My selection \(String(format: "%02d", selection))") // error
            Text("My selection \(String(format: "%02d", Int(selection)))") // works
            Text("My selection \(String(format: "%02d", $selection.binding.value))") // works
        
    

我知道这是 Beta 版软件,但很好奇是否有人能看出这种行为的原因,或者这只是一个错误。如果这不能解释,我会提交雷达。

【问题讨论】:

【参考方案1】:

在 beta 4 中,属性包装器的实现略有变化。在 beta 3 中,您的 View 被编译器重写为:

internal struct ContentView : View 
  @State internal var selection: Int  get nonmutating set 
  internal var $selection: Binding<Int>  get 
  @_hasInitialValue private var $$selection: State<Int>
  internal var body: some View  get 
  internal init(selection: Int = 2)
  internal init()
  internal typealias Body = some View

在 Beta 4 上,它执行以下操作:

internal struct ContentView : View 
  @State @_projectedValueProperty($selection) internal var selection: Int  get nonmutating set 
  internal var $selection: Binding<Int>  get 
  @_hasInitialValue private var _selection: State<Int>
  internal var body: some View  get 
  internal init(selection: Int = 2)
  internal init()
  internal typealias Body = some View

现在我猜:这种变化让编译器更难推断变量的类型?请注意,另一种可行的方法是通过转换 selection as Int 对编译器有所帮助:

Text("My selection \(String(format: "%02d", selection as Int))")

【讨论】:

这份搜查令是否提交雷达? 好问题。我想它不会受伤,对吗? 我向苹果提交了反馈。我们会看看会发生什么,如果他们回应,我会更新。【参考方案2】:

更新(Xcode 11.2)

我也得到了错误:

'inout Path' is not convertible to '@lvalue Path'

使用此代码:

struct ContentView : View 
    @State var selection = 2

    var body: some View 
        VStack 
            Text(String(format: "%d", selection)) // does not work
        
    

通过添加$前缀然后在String(format:, args:)中访问wrappedValue解决:

struct ContentView : View 
    @State var selection = 2

    var body: some View 
        VStack 
            Text(String(format: "%d", $selection.wrappedValue)) // works
        
    

【讨论】:

以上是关于在 Xcode11 Beta 4 中将 String(format: , args) 与 SwiftUI 一起使用时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 iOS 5.0 Beta 版本在 Xcode 4.2 中创建 IPA 文件

在 iOS 11.3 beta 2 中将 ARReferenceImage 与 ARKit 一起使用会导致“错误:运行 actool 时出现异常:”

不符合协议 BindableObject - Xcode 11 Beta 4

由于信号 9 Xcode 11 beta,编译命令失败

Xcode 4.2 Beta:我可以为 iOS 4.x 构建吗?

Xcode 11 beta 4 构建错误:“Command CompileSwiftSources failed with a nonzero exit code”(错误:未知参数:'-Wno-sho