Swift3中如何为Array写一个限定Type的扩展
2016-07-21 09:25
477 查看
我们知道Swift可以扩展已存在的类或结构,这些类或结构可以存在于标准库(或称为核心库)中.如果结构是一个集合类型(比如Array)就更有趣了.我们想尝试写一个限定Type数组的扩展,So我们就拿Array< Int>为例吧.
本猫想是不是可以这么写:
不过显然不可以 :[
翻看了一下Apple官方的Swift编程语言,一无所获.于是上网溜了一圈,发现一个可行的解决方法,是滴,必须要用where子句:
主要思想是我们不能直接拿Array开刀,但是可以间接用_ArrayType类型,可以看到最后一行代码出错,因为它是一个[String]型的数组.
不过别高兴太早了,上面的代码在Swift3中行不通,因为Swit3中压根就找不到_ArrayType类型 ;(
然而车到山前必有路,不能从Array入手,我们可以间接从其遵循的协议入手.于是在Swift3中有两种方法可以达到目的:
需要注意的是如果要把以上代码用在Swift2.x中需要在Sequence和Collection后面加上Type:
值得一提的是如果我们希望Array扩展中的元素遵循某个协议(而不是等于某种类型)的话可以这么写:
本猫想是不是可以这么写:
extension Array<Int>{ //.... }
不过显然不可以 :[
翻看了一下Apple官方的Swift编程语言,一无所获.于是上网溜了一圈,发现一个可行的解决方法,是滴,必须要用where子句:
extension _ArrayType where Element == Int{ func count(index:Int)->Int{ print("In _ArrayType") return 11*11 } } [1,2,3].count(2) ["1"].count(2) //error!!!
主要思想是我们不能直接拿Array开刀,但是可以间接用_ArrayType类型,可以看到最后一行代码出错,因为它是一个[String]型的数组.
不过别高兴太早了,上面的代码在Swift3中行不通,因为Swit3中压根就找不到_ArrayType类型 ;(
然而车到山前必有路,不能从Array入手,我们可以间接从其遵循的协议入手.于是在Swift3中有两种方法可以达到目的:
extension Sequence where Iterator.Element == Int{ func count(index:Int)->Int{ print("In Sequence") return index * index } } extension Collection where Iterator.Element == Int{ func count(index:Int)->Int{ print("In Collection") return index * index } }
需要注意的是如果要把以上代码用在Swift2.x中需要在Sequence和Collection后面加上Type:
SequenceType CollectionType
值得一提的是如果我们希望Array扩展中的元素遵循某个协议(而不是等于某种类型)的话可以这么写:
protocol Lovable{ func fallInLove(with name:String) } struct Love:Lovable{ func fallInLove(with name:String){ print("fall in love with \(name)") } } extension Array where Element:Lovable{ func count(index:Int)->Int{ print("In Array") return index * index } } let loves = [Love(),Love()] loves.count(index: 12)
相关文章推荐
- swift中使用OC的方法;在OC中调用swift方法
- 半吊子学习Swift--天气预报程序-获取天气信息
- Swift - 使用NSNotificationCenter发送通知,接收通知
- Swift - 文件,文件夹操作大全
- swift 单例写法
- Swift_枚举
- swift教程【入门】 swift 函数之旅
- Swift学习(六)-循环
- Swift基础(十一)多线程
- Swift学习(五)-逻辑判断
- Swift 中UIWebView 和 UINavigationController的应用
- Swift UIPasteboard 复制label上的文字
- Swift UITouch 的使用
- TabView的使用去除上面的空白, tabview点击后去除效果
- swift 移动支付之【微信支付】开发步骤
- swift 移动支付之【支付宝支付】详细步骤
- Swift 基本语法
- Swift 字符串切割 java substring
- Ubuntu 16.04上安装 Swift 3.0及问题解答
- swift相比oc的优势