swift - 在我的情况下通过协议类型访问变量
问题描述
我有一个协议 Foo:
protocol Foo {
func doJob()
}
我有一个符合协议的类,但也有自己的变量name
:
class Bar : Foo {
var name = ""
// conform to protocol
func doJob() {
// implementations
}
}
在我的扩展中Foo
,我想检查是否self
是 的实例Bar
,如果是,我想更新它的name
值。这是我尝试过的:
extension Foo {
func someJob() {
if self is Bar {
((Bar) self).name = "John"
}
}
}
但似乎 Swift 编译器不允许这样做,编译器告诉我“一行上的连续语句必须用 ';' 分隔”,这对我来说没有意义。如何达到我想要达到的效果?
解决方案
你可以挑选:
选项1
仅对Bar
符合以下条件的实例进行协议扩展Foo
:
extension Foo where Self == Bar { // or Self: Bar it is up to what you want
func someJob() {
self.name = "..."
}
}
选项 2
尝试在方法的主体self
中向下转换:Bar
extension Foo {
func someJob() {
if let barSelf = self as? Bar {
barSelf.name = "..."
}
}
}
推荐阅读
- java - 我如何有效地禁止用户使用 Spring Web 应用程序
- python - 使用数据框将列数据显示为单个列
- quarkus - 如何使用 web.xml 作为部署描述符本地构建基于 servlet 的 Quarkus 应用程序?
- c# - 子节点未正确序列化
- geofirestore - 如何处理 GeoFirestore 查询的读取操作?
- nand2tetris - 在第 0 行,表达式预期错误(Nand2tetris CPU-emulator)
- bash - 在 Mac OSX 上从 bash 脚本运行时出现 imagemagick 错误
- javascript - 如何记忆函数,以便从缓存中返回相同的参数
- ios - 如何将您的应用程序注册为“复制到”而不是“打开方式”到某个文档类型
- google-maps - Android - 如何通过意图触发具有多个航点的独立导航应用程序?