ObjC/Swift Swift 代码片段求解释

blacktulip · 2014年06月03日 · 最后由 nouse 回复于 2014年06月04日 · 7862 次阅读

Functions are a first-class type. This means that a function can return another function as its value.

func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

Excerpt From: Apple Inc. The Swift Programming Language. iBooks. https://itun.es/gb/jEUH0.l

请问那个第一行的 (Int -> Int) 怎么理解啊

makeIncrementer 的返回类型是一个 (Int -> Int) 类型的函数函数,也就是说这个函数接受一个 Int 类型的参数并且返回 Int 类型的值

#1 楼 @oa414 明白了,谢谢。

#2 楼 @blacktulip makeIncrementer() 回傳 addOne,接受一個 Int 參數。

#3 楼 @Juanito 谢谢,方才理解错了。

看来 Swift 有类型系统和泛型...挺像 scala,不知道是不是像 scala 那么鬼畜

闭包的语法比原来的 block 好看多了

其实我觉得这实在是冗余,第一行 和 第二行 都包含了 Int -> Int 的内容,这样设计是为什么呢?

设计思维吧……Python 式的……

……不像 scala 有那么厉害的类型推断……

9 楼 已删除

#7 楼 @blacktulip 就是只支持局部类型推断,如果像 Haskell 那样做全程序分析的类型推断,没有多年积累的复杂算法的话会编译挂掉...

我的理解:

第 1 行是宣告这个 func 要返回的是一个「输入是 Int,输出是 Int」的 func

第 2 行是宣告一个新的 func 其「输入是 Int,输出是 Int」

最后的 return 就必须回传一个 type 跟 1 所宣告的 func type 有 match 的 func。

也就是说 1 和 2 的 (Int -> Int) 是分开的,首先 function 要宣告 return type,接著动态产生的 function 也要宣告 type,其 type 要 match return type。把它当一个变数来想就行了。

厉害。看起来都象是 3 年经验的 swift 程序员。

#11 楼 @saiga 明显是借鉴 Java 的范型 #7 楼 @blacktulip 感觉为了方便静态语言 IDE 查错。 Java 的范型只在 compile 时会对不匹配类型报错,compile 后的 byte code 后范型就没了。

定义后置,有点 go 的味道。

#7 楼 @blacktulip "a function can return another function as its value."

需要 登录 后方可回复, 如果你还没有账号请 注册新账号