gpt4 book ai didi

swift - 如何调用模棱两可的方法?

转载 作者:搜寻专家 更新时间:2023-10-31 08:05:33 24 4
gpt4 key购买 nike

给定这段代码

extension Array {
func filter(includeElement: (T) -> Bool) -> T[] {
var ret = T[]()
for e in self {
if includeElement(e) {
ret += e
}
}
return ret
}
}

var a = [1,2]
var b = a.filter() {i in print(i); return true}

编译失败,提示错误

error: ambiguous use of 'filter'
var b = a.filter() {i in print(i); return true}
^
Swift.Array<T>:84:8: note: found this candidate
func filter(includeElement: (T) -> Bool) -> Array<T>
^
<REPL>:30:10: note: found this candidate
func filter(includeElement: (T) -> Bool) -> T[] {
^

所以看起来我被允许创建具有重复方法和签名的扩展方法,但我不知何故需要一种特殊的方式来调用它


顺便说一句,默认的 Array.filter 被破坏了,它为每个元素调用闭包两次并导致 REPL 崩溃,或者如果结果不一致则在 playground 中给出垃圾结果

xiliangchen-imac:~ xiliangchen$ xcrun swift
Welcome to Swift! Type :help for assistance.
1> let arr = [1,2,3,4,5]
arr: Int[] = size=5 {
[0] = 1
[1] = 2
[2] = 3
[3] = 4
[4] = 5
}
2> var i = 0
i: Int = 0
3> let arr2 = arr.filter() {
4. println($0)
5. return i++ < 5
6. }
Segmentation fault: 11

最佳答案

我认为定义模棱两可的方法没有问题。当您从不同模块导入 2 个模棱两可的方法时,就会出现问题。不幸的是,没有办法排除 Array.filter 被导入。

我做了一些测试,在我看来,模棱两可的定义的行为没有很好地定义,例如:

extension NSString {
func hasPrefix(aString: String!) -> Bool {
return false
}
}

let string: NSString = "test"

var hasPrefix = string.hasPrefix("t")
println("Has prefix: \(hasPrefix)") //prints "true"

var method = string.hasPrefix
hasPrefix = method("t")

println("Has prefix: \(hasPrefix)") //prints "false"

obj-c 类的行为可能不同...

对于函数,似乎首选当前模块的定义:

func NSStringFromCGPoint(point: CGPoint) -> String! {
return "My method"
}

var point = CGPoint(x: 10.0, y: 10.0)

println("Point: \(NSStringFromCGPoint(point))") //Prints "My method"
println("Point: \(UIKit.NSStringFromCGPoint(point))") //Prints "{10, 10}"

关于swift - 如何调用模棱两可的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24097292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com