如何在 Swift 中更改结构属性

Posted

技术标签:

【中文标题】如何在 Swift 中更改结构属性【英文标题】:How to change struct properties in Swift 【发布时间】:2020-01-29 20:49:16 【问题描述】:

我正在尝试 Swift Playground,但我找不到改变结构值的方法。下面我想从默认值更改 Shadow 的属性。

我已经尝试了初始化程序和点语法,但我得到‘由于内部保护级别,字段不可访问。

let circle = Circle()
circle.draggable = true
//var shadow = Shadow(color: #colorLiteral(red: 0.9529411764705882, green: 0.6862745098039216, blue: 0.13333333333333333, alpha: 1.0), offset: Point(3,-3), blurRadius: 5, opacity: 1)
var shadow = Shadow()
shadow.color = .red
circle.dropShadow = shadow

【问题讨论】:

【参考方案1】:

您显然正在使用“形状”游乐场。

因此,通过单击“...”»“高级”»“查看辅助源文件”»“内容”»“模块”»“Book.playgroundmodule”»“源”»“PlaygroundAPI”来查看源。

如果您查看Shadow 结构,这些属性都没有被声明为public。这意味着您无法在该模块之外访问它们。

相比之下,如果您对比查看Circle 声明,radius 是公开的。如果你看AbstractDrawabledropShadow 也是public

在没有显式访问限定符(例如,public)的情况下,属性将获得 internal 访问限定符,只能在该模块内访问。 (参见The Swift Programming Language: Access Control。)您在那个操场上的代码与定义Shadow 的模块不在同一个模块中。因此您无权访问它。

因此,最重要的是,您的警告只是告诉您无法访问 Shadow struct 的此内部属性。


这引出了一个问题,即为什么他们声明 Shadow 以至于您无法自定义阴影的性质。我怀疑这只是他们的疏忽。例如,我在 Xcode 中打开了这个 Playground 工作簿,并将 Shadowinit 方法替换为以下内容:

public init(offset: Point = Point(x: 1, y: -1), blurRadius: Double = 1, opacity: Double = 0.3, color: Color = .black) 
    self.offset = offset
    self.blurRadius = blurRadius
    self.opacity = opacity
    self.color = color

然后我可以在我的 iPad 上重新打开这个游乐场并执行以下操作:

let circle = Circle(radius: 30)
circle.dropShadow = Shadow(opacity: 0.9, color: .green)

结果如下:

【讨论】:

嗯..哇。不敢相信他们会搞砸如此明显的事情。这应该报告给“Apple - 地球上最具创新性的隐私关注公司”吗?关于查看源代码,是在 PC 上的 Xcode 上吗? Bcz 我在 iPad 上工作,不知道如何去做。我假设“操场工作簿”也是如此;只能在 PC 上编辑? 您可以在 iPad 上查看源代码(通过点击“...”按钮和上面我的答案中显示的后续菜单项)。但是要编辑该 Playground 中隐藏的额外源文件,我必须在我的 Mac 上执行此操作,打开位于我的 iCloud Drive 中的 Playground(当我在 iPad 上创建 Playground 时,它们是保存在 iCloud 中,然后我可以在 macOS 中打开)。

以上是关于如何在 Swift 中更改结构属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中更改 UILabel 文本某些部分的字体属性? [复制]

如何在可编码结构中使用计算属性(swift)

Swift之深入解析SwiftUI属性包装器如何处理结构体

Swift:如何在结构范围之外修改结构属性

Swift inout 如何在未更改时不复制回属性,以不触发对象设置器

如何在swift中使用其他属性将实例作为属性传递