Swift3中如何为Array写一个限定Type的扩展

Swift3中如何为Array写一个限定Type的扩展,第1张

概述我们知道Swift可以扩展已存在的类或结构,这些类或结构可以存在于标准库(或称为核心库)中.如果结构是一个集合类型(比如Array)就更有趣了.我们想尝试写一个限定Type数组的扩展,So我们就拿Array< Int>为例吧. 本猫想是不是可以这么写: extension Array<Int>{ //....} 不过显然不可以 :[ 翻看了一下Apple官方的Swift编程语言,一无所获

我们知道Swift可以扩展已存在的类或结构,这些类或结构可以存在于标准库(或称为核心库)中.如果结构是一个集合类型(比如Array)就更有趣了.我们想尝试写一个限定Type数组的扩展,So我们就拿Array< Int>为例吧.

本猫想是不是可以这么写:

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:

SequenceTypeCollectionType

值得一提的是如果我们希望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)
总结

以上是内存溢出为你收集整理的Swift3中如何为Array写一个限定Type的扩展全部内容,希望文章能够帮你解决Swift3中如何为Array写一个限定Type的扩展所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1073900.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存