判断Struct是否符合协议,但如果嵌套 struct 是可选的,则始终返回false

示例:

protocol XYZ {

}

extension XYZ {
  func test() { 
     print("asdsfd") 
  } 
}

struct Test1: XYZ { 
  var test2: Test2 
  var test3: Test3?

  init(){
    self.test2 = Test2()
    self.test3 = Test3() 
  }
}

struct Test2: XYZ {

}

struct Test3: XYZ {

}

现在:如果我想判断 struct 是否使用了协议

let x = Test1()

以下条件为真,因为Test2符合XYZ协议

print(type(of: x.test2) is XYZ.Type)

下面的条件将为FALSE,因为符合XYZ协议的Optional<Test2>应该是true,但由于可选,它返回false

print(type(of: x.test3) is XYZ.Type)

我应该如何处理可选的在这种情况下,我试图解开可选的,但它没有发生.如有任何帮助,我们不胜感激.

我试着解开可选选项,但没有实现.我正在试图找到一种方法来比较可选类型与协议的一致性.

推荐答案

The Swift Programming Language: Protocols: Checking for Protocol Conformance,其中isas?as!操作员可以直接判断一致性,而无需提取type(of:):

Checking for Protocol Conformance

您可以使用Type Casting中描述的isas运算符来判断 用于协议一致性,并强制转换为特定协议.正在判断 FOR和转换为协议所遵循的语法与 判断类型并将其转换为类型:

  • 如果实例符合协议,则is运算符返回true 如果不是,则返回false.

  • Downcast运算符的as?版本返回可选值 协议的类型,如果实例不是,此值为nil 遵守该协议.

  • Downcast运算符的as!版本将Downcast强制为 协议类型,并触发运行时错误(如果下传未 成功.

因此,与其说:

print(type(of: x.test2) is XYZ.Type) // true
print(type(of: x.test3) is XYZ.Type) // false

您可以避免type(of:),并直接测试一致性(它处理可选选项):

print(x.test2 is XYZ)                // true
print(x.test3 is XYZ)                // true

Swift相关问答推荐

字符串目录不适用于SWIFT包

依赖于@Environment的init@StateObject

SwiftUI正在初始化不带状态变量的绑定变量

编写Swift字符串的属性包装时遇到问题

如何强制创建新的UIViewControllerRenatable|更新Make UIViewController上的视图

String.Index encodedOffset已弃用,但建议的替代方案不起作用

如何将多个完成处理程序转换为异步?

如何判断设备是否为 Vision Pro - Xcode 15 Beta 4

有没有办法让文本字段以不同的 colored颜色 显示而不影响半透明背景?

列表不显示信息

使用泛型的 Swift 枚举值

如何在 SwiftUI 中用图像替换占位符文本?

RxSwift 提高性能

Swift 非参与者隔离闭包

iOS SwiftUI - 无法转换 ObservedObject 类型的值

令人满意的 var body:协议扩展中的一些视图

故事板未在助手中显示视图控制器

SwiftUI 文本被意外截断

CMutablePointer - 如何访问它?

转换为 swift 3 后,视图控制器中出现奇怪的通用函数