是否可以在 Swift 中创建具有 Self 或关联类型要求的通用计算属性,如果可以,如何?

Posted

技术标签:

【中文标题】是否可以在 Swift 中创建具有 Self 或关联类型要求的通用计算属性,如果可以,如何?【英文标题】:Is is possible to create generic computed properties with Self or associated type requirements in Swift, and if so how? 【发布时间】:2019-07-08 06:15:37 【问题描述】:

考虑以下几点:

protocol SomeProtocol: Equatable 

// then, elsewhere...

var someValue: Any?

func setSomething<T>(_ value: T) where T: SomeProtocol 
    someValue = value


func getSomething<T>() -> T? where T: SomeProtocol 
    return someValue as? T

这些函数工作正常,但本质上类似于计算属性。有什么方法可以实现以下内容吗?

var something<T>: T where T: SomeProtocol 
    get  return someValue as? T 
    set  someValue = newValue 

感谢您的阅读。抱歉,如果这个问题已经在其他地方问过,我已经搜索过,但有时我的搜索功能很弱。

【问题讨论】:

你想达到什么目的?这在哪里派上用场? 更少的代码更清晰@MojtabaHosseini 为什么计算属性返回存储属性?为什么不这样:struct SomeStruct&lt;T:SomeProtocol&gt; var someValue: T? 【参考方案1】:

需要在泛型类型上定义计算属性,计算属性本身不能定义泛型类型参数。

struct Some<T:SomeProtocol> 
    var someValue:Any

    var something:T? 
        get 
            return someValue as? T
        
        set 
            someValue = newValue
        
    

【讨论】:

@ScottyBlades 您可以在Some 的扩展中定义something,但您仍然需要通用结构/类。只有SomeProtocol 是行不通的。

以上是关于是否可以在 Swift 中创建具有 Self 或关联类型要求的通用计算属性,如果可以,如何?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 Swift 中创建具有非可选属性的类型擦除弱引用吗?

在 Swift 3 中创建具有自定义大小的 VideoPlayer

如何在 Swift 中创建具有自定义形状的 UIButton?

如何使用 Swift 在 Firebase 中创建具有多个属性的用户?

在具有整数值的类中创建函数[重复]

如何使用 UIKit 在 Swift 5 中创建具有内在高度的 UITableView?