《The Swift Programming Language》swift初见,泛型练习怎么做?

[复制链接]
294 4
《The Swift Programming Language》swift初见,泛型练习怎么做?



func anyCommonElements  (lhs: T, rhs: U) -> Bool {
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
return true
}
}
}
return false
}
anyCommonElements([1, 2, 3], [3])
练习: 修改anyCommonElements函数来创建一个函数,返回一个数组,内容是两个序列的共有元素。

以下是我自己尝试写的:
func commonElements(lhs: T, rhs: U) -> T {
var result = T()
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
result.append(lhsItem)
}
}
}
return result
}
反正最后我怎么改都改不对.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

4 个评论

l46162663  新手上路  发表于 2019-2-21 05:16:54  | 显示全部楼层
《The Swift Programming Language》swift初见,泛型练习怎么做?   



func anyCommonElements <T, U where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, rhs: U) -> Bool {
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                return true
            }
        }
    }
    return false
}
anyCommonElements([1, 2, 3], [3])
练习: 修改anyCommonElements函数来创建一个函数,返回一个数组,内容是两个序列的共有元素。

以下是我自己尝试写的:
func commonElements<T, U where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element>(lhs: T, rhs: U) -> T {
    var result = T()
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                 result.append(lhsItem)
             }
         }
     }
return result
}
反正最后我怎么改都改不对.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复
lemonlime  新手上路  发表于 2019-2-21 05:59:10  | 显示全部楼层
刚看到闭包 还没看到泛型 一块学吧 留个Q吧

举报 使用道具

回复
amnour  新手上路  发表于 2019-2-21 07:49:06  | 显示全部楼层
如下增加where子句 where T:CollectionType, T:ExtensibleCollectionType

func commonElements<T, U where T:CollectionType, T:ExtensibleCollectionType, T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element>(lhs: T, _ rhs: U) -> T {
    // typealias T
    var result  = T()
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                result.append(lhsItem)
            }
        }
    }
    return result
}

commonElements([1, 2, 3], [3])   // result is 3

举报 使用道具

回复
我爱你?  注册会员  发表于 2019-2-21 08:03:57  | 显示全部楼层
引用 2 楼 happy__888 的回复:
如下增加where子句 where T:CollectionType, T:ExtensibleCollectionType

func commonElements<T, U where T:CollectionType, T:ExtensibleCollectionType, T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element>(lhs: T, _ rhs: U) -> T {
    // typealias T
    var result  = T()
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                result.append(lhsItem)
            }
        }
    }
    return result
}

commonElements([1, 2, 3], [3])   // result is 3


谢谢你的答案
不过我发现ExtensibleCollectionType继承了CollectionType, CollectionType又继承了SequenceType,所以T只要实现ExtensibleCollectionType就可以了.

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

ios.irunthink.com
搜索
热搜: iOS swift 下拉刷新

图文热点

更多

开发教程

更多

客服中心

400-800 周一至周日 9:30-17:30 仅收市话费

关注我们

  • 微信扫描
  • 关注微信
关于我们
关于我们
友情链接
联系我们
帮助中心
精贴推荐
源码上传
注册登录
服务支持
资源下载
关注我们
官方微博
官方空间
快速回复 返回顶部 返回列表