首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Binding a: Int与Binding<Int>在SwiftUI中的区别?

@Binding a: Int与Binding<Int>在SwiftUI中的区别?
EN

Stack Overflow用户
提问于 2020-07-21 19:47:08
回答 2查看 1.1K关注 0票数 2

我有一个UIPageViewController,它被封装在一个SwiftUI视图中。视图是用@Binding值实例化的:

代码语言:javascript
复制
PageView([Text("Hello")], currentPage: $page)

我有一些内部状态,我想根据传入的@Binding变量进行更改。

代码语言:javascript
复制
    @State var currentPageIndex: Int
    @State var goRight: Bool?
    
    public var currentPage: Binding<Int> {
        Binding(
            get: {
                return self.currentPageIndex
        },
            set: {
                self.goRight = ((self.currentPageIndex - $0) > 0)
                self.currentPageIndex = $0
        }
        )
    }

当我尝试根据这个索引设置UIPageViewController时,

代码语言:javascript
复制
pageViewController.setViewControllers([controllers[currentPage]], direction: .forward, animated: true)

此行因错误Cannot convert value of type 'Binding<Int>' to expected argument type 'Int'而失败

然而,当我只使用一个@Binding值而不做任何处理时,

代码语言:javascript
复制
@Binding var currentPage: Int

一切都很好。我理解这个问题的核心是,@Binding var blah: Intvar blah: Binding<Int>之间有某种区别,为什么会这样呢?为什么要访问类型Binding<Int>的底层值还要做一些其他的事情呢?我理解这些东西是两种不同的方式来表达相同的东西。或者它们不是同等的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-21 20:23:11

使用

代码语言:javascript
复制
@Binding var blah: Int

blah是一个Int@Binding是一个属性包装器,它通过$blah (一种Binding<Int>类型)投影一个值。所以,他们是不一样的。

类似地,@State属性包装器将生成一个Binding。因此,您实际上不需要创建一个计算属性,就像对public var currentPage: Binding<Int>所做的那样。你可以这样做:

代码语言:javascript
复制
self.$currentPageIndex

但是,如果需要从Binding<T>访问基础值,则可以使用.wrappedValue属性

票数 2
EN

Stack Overflow用户

发布于 2020-07-21 20:48:30

代码语言:javascript
复制
@Binding var blah: Int

变成了

代码语言:javascript
复制
var _blah: Binding<Int>
var blah: Int {
    get {
        _blah.wrappedValue
    }
    set {
        _blah.wrappedValue = newValue
    }
}

这意味着,如果您有一个@Binding var foo: Intvar bar: Binding<Int>,下面是您如何做类似的事情:

代码语言:javascript
复制
struct MyView: View {
    //assume these are correctly initialized
    @Binding var foo: Int
    var bar: Binding<Int>

    var body: some View {
        //some body
    }

    func example() {
        // these are equivalent
        foo == bar.wrappedValue
        _foo == bar
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63022030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档