我可以指定泛型是值类型吗?

2024-05-21

我知道我们基本上可以通过使用指定我们的泛型是任何引用类型AnyObject:

class Foo<T: AnyObject> {
    // ...
}

但是有没有办法指定我们的泛型只能是value类型,并且不允许引用类型?


// some code for testing    
class C { } // just a simple class as an example for a reference type
var c = C()
var d: Double = 0.9 // a value type

解决方案1通过extension

protocol ValueType { }
extension Double : ValueType { }
extension Int : ValueType { }
// ... all value types to be added

func printT1 <T: ValueType> (input: T) {
    println("\(input) is value")
}
printT1(d) // Does work
//printT1(c) // Does not work

但正如评论中提到的,它有效但不可行,因为用户定义的值类型必须实现此协议。


解决方案2通过方法签名

func printT <T: AnyObject> (input: T) {
    println("\(input) is reference")
}

func printT <T: Any> (input: T) {
    println("\(input) is value")
}

解决方案3通过assert

另一种解决方案可以是通过assert

func printT <T: Any> (input: T) {
    print("\(input) is " + ((T.self is AnyObject) ? "reference" : "value"))
}

“解决方案”4通过where clauses

我认为这将是最好的解决方案。不幸的是,不可能有

func printT <T: Any where T: ~AnyObject > (input: T) {
    println("\(input) is value")
}

或类似的。也许在 Swift 的未来版本中这将成为可能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以指定泛型是值类型吗? 的相关文章

  • iOS、Swift 3 - 当我从详细视图返回后单击“取消”时,UISearchBar 消失

    我在containerView中有一个tableView 以编程方式向其添加一个搜索栏 一切工作正常 除了这种情况 当我点击一个单元格时 当 tableView 由 searchBar 过滤时 然后我从明细视图返回 通过推送转场呈现 然后我
  • 具有 Void 关联类型的通用 Swift 4 枚举

    tl dr 是否可以实例化具有关联类型值的通用 Swift 4 枚举成员Void 背景 我正在使用一个简单的Result枚举 类似于反典型结果 https github com antitypical Result enum Result
  • 是否可以实现包含 nil 元素的 Swift SequenceType?

    我想实现一个可以包含 nil 元素的自定义可迭代类 类似于 Any 除了合同之外 符合 SequenceType 大部分都有效GeneratorType next 说当所有元素都用完时它应该返回 nil 有解决方法吗 这是一个 相当愚蠢的
  • 来自 IOS Xcode 的 Azure 推送通知错误

    我觉得我是世界上第一个尝试让 iOS 快速与 Azure 配合使用的人 但没有太多帮助 我跟着这个创建 iOS 应用程序 https azure microsoft com en us documentation articles app
  • 与嵌套泛型集合的混淆

    请帮助我理解为什么add1 and add4 报告错误以及原因add2 and add3 不 具体来说 请举例说明如果编译器允许其中每一个进行编译 则会产生不良后果的示例 class InnerTypeConfusion interface
  • 在 Objective-C 中导入 Swift 类,-Swift.h 文件未找到

    我有一个用 Objective C 编写的 iOS 项目 我在项目中创建了一个Swift类 成功生成了Swift中访问objective c的桥接头文件 并且运行良好 我的问题是相反的 我想在 Objective C 代码中导入 Swift
  • 运行时的泛型[重复]

    这个问题在这里已经有答案了 有两个程序 为什么第一个代码有效 我希望它在访问元素时抛出运行时异常 因为添加了字符串而不是整数 相似地 第二个代码在访问元素时抛出运行时异常 尽管它能够轻松地在 arrayList 中添加 Integer 尽管
  • 如何从 Class - Swift 实现序列化 NSDictionary

    在 Objective C 中 我使用以下代码将自定义类序列化为工作正常的字典 为了熟悉Swift 将Objective C代码移植到Swift 但是我无法实现这一点 我该如何用 Swift 实现这一点呢 这就是我用 Objective C
  • 如何使用泛型而不是注释来实现构建器类?

    我想写一个通用的建造者阶级它包装任何 java 类并提供特定样式的 setter 函数 我不确定这是否可以称为 动态生成的函数 当我有一个豆子般的 Pojo 课时 即 class Pojo public void setValue int
  • 返回 Self 的协议函数

    我有一个返回对象副本的协议 P protocol P func copy gt Self 和一个实现 P 的 C 类 class C P func copy gt Self return C 但是 我是否将返回值设置为Self我收到以下错误
  • 如何在导航栏中添加右键?

    我有一个问题要在导航栏中添加右键 我有两个视图 视图 A 和视图 B 我添加了一个导航栏来查看A 之后我使用了self navigationController pushViewController显示视图 B 视图B的导航栏左侧自动显示一
  • Swift 完成处理程序语法

    此代码用于回答此处的问题 如何在 Swift 中发出 HTTP 请求 https stackoverflow com questions 24016142 how to make an http request in swift let u
  • Xcode 8 beta“错误”对于这种情况下的类型查找不明确

    根据这篇文章 我需要指定模块来查找对象类型 在此上下文中 方法 对于类型查找不明确 Alamofire 中的错误 https stackoverflow com questions 33543597 method is ambiguous
  • UITextField 文本更改事件

    如何检测文本字段中的任何文本更改 委托方法shouldChangeCharactersInRange适用于某些东西 但它并不能完全满足我的需求 因为在它返回 YES 之前 textField 文本不可用于其他观察者方法 例如在我的代码中ca
  • 在 Swift 中获取 UIImage 的主颜色

    我正在尝试在 Swift 中获取 UIImage 的主颜色 并尝试移植这段代码 https stackoverflow com questions 13694618 objective c getting least used and mo
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • iOS 自定义单元格设计放在哪里? awakeFromNib 还是 cellForRowAtIndexPath?

    所以 基本上我用笔尖做了一个定制单元 希望我应用一些定制设计 比如颜色和阴影 我发现了两种应用样式的方法 awakeFromNib override func awakeFromNib super awakeFromNib Containe
  • CLLocation Manager如何在一定距离后更新

    我正在使用 CLLocationManager didupdatelocations 如下所示 func locationManager manager CLLocationManager didUpdateLocations locati
  • 在 Android 上使用 opus 剪辑从 IOS 发送的声音

    我正在 IOS 中从 audioUnit 录制音频 用 opus 编码字节并通过 UDP 将其发送到 android 端 问题是播放的声音有点削波 我还通过将原始数据从 IOS 发送到 Android 来测试声音 效果非常完美 我的 Aud
  • 如何在 iOS 上压缩 Realm DB?

    我想定期压缩 iOS 上的 Realm 实例以回收空间 我认为该过程是将数据库复制到临时位置 然后将其复制回来并使用新的default realm 文件 我的问题是Realm 其行为就像单例并回收对象 因此我无法真正关闭它并告诉它打开新的

随机推荐