V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kalintw
V2EX  ›  Swift

对于数学运算 Swfit 不自动提升和转换类型,这难道不是脑残的设计?

  •  
  •   kalintw · 2015-08-10 08:27:34 +08:00 · 5925 次点击
    这是一个创建于 3398 天前的主题,其中的信息可能已经有所发展或是发生改变。
    土鳖对此表示不解,如此酸爽?
    57 条回复    2015-09-29 13:10:07 +08:00
    qdwang
        1
    qdwang  
       2015-08-10 08:29:43 +08:00 via Android
    猜测lz很喜欢js
    wangyifei6817
        2
    wangyifei6817  
       2015-08-10 08:31:06 +08:00
    js写多了不适应强类型吧?
    kalintw
        3
    kalintw  
    OP
       2015-08-10 08:34:40 +08:00
    @qdwang
    @wangyifei6817

    各位大哥,强类型的C语言也不是这么玩的吧。
    Int乘以Double,还非得Double(Int)一下,哎
    laucie
        4
    laucie  
       2015-08-10 08:35:32 +08:00
    @kalintw 同意 C也有自动转换
    ipconfiger
        5
    ipconfiger  
       2015-08-10 08:49:15 +08:00
    没有被自动转换坑过?
    zylll520
        6
    zylll520  
       2015-08-10 08:51:28 +08:00
    思路不一样,Swift 倒有点像把大家都约定好的格式全部省略,把隐藏的格式明显标示
    publicID001
        7
    publicID001  
       2015-08-10 08:52:16 +08:00 via Android   ❤️ 1
    @kalintw C 是弱类型的
    kalintw
        8
    kalintw  
    OP
       2015-08-10 08:52:33 +08:00
    @ipconfiger

    好吧。。。

    那这个捏,更好玩了:
    var x: Int = 4
    var y: Double = 8.0

    // error, 就因为等号左边少了个空格
    var c= Double(x) + y

    // error, 就因为等号右边少了个空格
    var c =Double(x) + y

    // pass
    var c = Double(x) + y
    echo1937
        9
    echo1937  
       2015-08-10 08:52:38 +08:00
    @kalintw 我一直以为:

    弱类型、静态类型 : C/C++

    http://www.zhihu.com/question/19918532
    kalintw
        10
    kalintw  
    OP
       2015-08-10 08:55:03 +08:00
    @publicID001
    好像C#是强类型的,有没有会C#的,C#中数学运算会自动提升数据类型吗?
    ipconfiger
        11
    ipconfiger  
       2015-08-10 08:57:21 +08:00
    C#中数学运算会自动提升数据类型
    kalintw
        12
    kalintw  
    OP
       2015-08-10 09:00:16 +08:00
    @ipconfiger
    看了 @echo1937 的链接,看来真正的强类型是Swift,其余的都弱爆了
    jeremaihloo
        13
    jeremaihloo  
       2015-08-10 09:02:09 +08:00
    C#的类型转换,隐式转换和显示转换
    alvin2ye
        14
    alvin2ye  
       2015-08-10 09:03:06 +08:00
    @kalintw 这是优点好吗
    wezzard
        15
    wezzard  
       2015-08-10 09:08:19 +08:00
    不是腦殘設計,是非常好的設計,因爲顯式類型轉換可能會跨越精度,隱式類型轉換基本都是 typealias 或者 literal value。

    Swift 是一個講究 code level safety 的語言,不像 C 充分信賴程序員。
    FrankFang128
        16
    FrankFang128  
       2015-08-10 09:09:44 +08:00 via Android
    圣战
    kalintw
        17
    kalintw  
    OP
       2015-08-10 09:14:03 +08:00
    @wezzard
    @zylll520

    嗯,这些限定的确有很好的引导作用,比如我8楼的例子
    morethansean
        18
    morethansean  
       2015-08-10 09:14:13 +08:00
    看到楼上这句 “不是脑残设计,是非常好的设计”,我瞬间觉得什么都说不出。
    guotie
        19
    guotie  
       2015-08-10 09:18:16 +08:00
    真的不是脑残设计,是非常好的设计

    go也是这样
    jaminzzhang
        20
    jaminzzhang  
       2015-08-10 09:20:16 +08:00
    swift的书上有专门的介绍,可以认真看看书。楼上已经有人回答了,看来LZ真的没有被自动类型转换坑过
    Perry
        21
    Perry  
       2015-08-10 09:20:36 +08:00 via iPhone
    有个 IDE(Xcode)不是多大事情吧 8 楼的例子
    wezzard
        22
    wezzard  
       2015-08-10 09:39:41 +08:00
    單單以爲方便就是好的設計,我也瞬間感覺甚麼都說不出。
    likid
        23
    likid  
       2015-08-10 09:39:59 +08:00
    var c= Double(x) + y // Error, Prefix/postfix '=' is reserved
    dorentus
        24
    dorentus  
       2015-08-10 09:58:50 +08:00
    Swift 1.2 曾经支持过 implicit conversion 的,原生类型默认没有,但是当时你可以写这样的代码:

    extension Double {
    func __conversion() -> UInt8 { return UInt8(self) }
    func __conversion() -> Int { return Int(self) }
    // add more if you need to
    }

    那时 String 和 NSString 之类也是隐式转来转去的,经常出各种问题……
    huanglexus
        25
    huanglexus  
       2015-08-10 10:06:15 +08:00
    楼组应该学一学编译原理
    ibremn
        26
    ibremn  
       2015-08-10 10:15:58 +08:00
    @kalintw
    8楼没用过 Python 吗。。少个空格试试╮( ̄▽ ̄")╭
    jiang42
        27
    jiang42  
       2015-08-10 10:27:27 +08:00 via Android
    @kalintw 在我看来,C不是强类型语言。BTW, 强弱类型并没有一个明确的定义。所以最好不要说某语言是强类型。

    Swift的设计没啥问题。

    难道以后圣战又要多一个项目了么……
    publicID001
        28
    publicID001  
       2015-08-10 10:44:54 +08:00
    @jiang42 类型系统是个超级大坑
    publicID001
        29
    publicID001  
       2015-08-10 10:46:51 +08:00
    kalintw
        30
    kalintw  
    OP
       2015-08-10 10:48:36 +08:00
    @ibremn
    你说的是缩进吧
    w88975
        31
    w88975  
       2015-08-10 10:51:32 +08:00
    @kalintw 我觉得不自动进行类型转换是好处大于坏处的,如果涉及到比较高精度的计算,你就知道这种设计的好处了.
    jiang42
        32
    jiang42  
       2015-08-10 10:51:49 +08:00 via Android
    @publicID001 诶,你给我发维基地址干嘛,我没说错啊,there is no universally accepted definition of what these terms mean.

    想一想类型系统有多少paper,颤抖吧凡人
    kalintw
        33
    kalintw  
    OP
       2015-08-10 10:53:15 +08:00
    @huanglexus
    各有所爱,学了编译原理我也觉得适当的自动类型隐式转换还是挺好的
    publicID001
        34
    publicID001  
       2015-08-10 10:57:26 +08:00
    @kalintw 显示类型转换在我看来感觉是防呆设计
    JohnSmith
        35
    JohnSmith  
       2015-08-10 10:59:10 +08:00
    不太推荐隐式转化,近年出的静态语言都要求显示转换了
    wangyifei6817
        36
    wangyifei6817  
       2015-08-10 10:59:35 +08:00
    C是强类型?
    想学swift就按照swift的类型玩,被自动转换坑过的都知道强类型推断的好处
    至于你那个等号的问题 是因为实现了运算符重载协议 导致的冲突 要么空格 要么重载运算符
    kalintw
        37
    kalintw  
    OP
       2015-08-10 11:00:31 +08:00
    @ipconfiger
    @jiang42
    @w88975
    @publicID001
    @jaminzzhang
    @huanglexus

    既然这种严格的类型检查safe,好处大,奇怪为啥Python、Ruby这些语言都提供了隐式类型转换?
    publicID001
        38
    publicID001  
       2015-08-10 11:01:10 +08:00
    @kalintw 符合直觉
    fo2w
        39
    fo2w  
       2015-08-10 11:04:02 +08:00
    说委婉一点, 就是
    因为没有被大坑过, 所以觉得自信满满
    说直白一点, 就是
    因为无知, 所以无畏
    kalintw
        40
    kalintw  
    OP
       2015-08-10 11:05:45 +08:00
    @fo2w
    呵呵,多谢夸奖
    magicyu1986
        41
    magicyu1986  
       2015-08-10 11:46:32 +08:00
    对多语言技能的人来讲,确实是个坑...
    bleaker
        42
    bleaker  
       2015-08-10 11:48:56 +08:00
    强类型 - 弱类型
    静态类型 - 动态类型

    这两组概念还是有一些不同的
    ipconfiger
        43
    ipconfiger  
       2015-08-10 12:13:43 +08:00
    @kalintw 习惯的力量是巨大的
    chmlai
        44
    chmlai  
       2015-08-10 12:17:45 +08:00
    @kalintw Python/Ruby 和 Swift 设计目标就不一样.
    jiang42
        45
    jiang42  
       2015-08-10 12:22:39 +08:00 via Android   ❤️ 1
    @kalintw 符合直觉。说的直白点,小白觉得好用。

    语言设计本身就是无数个tradeoff,完全看语言设计者的决策。你只提到了Ruby,Python,为什么不去看看Haskell和Ocaml呢。

    当1.0+1!=2的时候你会感谢显式类型转换的
    Shy07
        46
    Shy07  
       2015-08-10 14:13:30 +08:00
    Swift 和 Python 不清楚,但是 Ruby 是强类型的,Ruby 的变量是“Duck Type”,隐式转换的前提是对象存在 to_s, to_i 这类转换方法。
    eg:
    a = 10086
    puts a # 打印的不是 a 本身的对象,而是 a.to_s 返回的对象,隐式转换
    a = "10086" # 为什么可以改变 a 的类型?Ruby 的变量是动态类型
    puts a == 10086 # => false,为什么?因为 a 是 String,10086 是 Fixnum,强类型
    puts 10087 == a.to_i + 1 # => true,显示转换类型,为什么支持调用 to_i ?Duck Type
    puts 10087 == a + 1 # => no implicit conversion of Fixnum into String (TypeError)

    如果想要看到
    document.write('10086' == 10086); // => true
    这类代码,我建议还是继续 JS 大法好吧
    jiang42
        47
    jiang42  
       2015-08-10 14:22:53 +08:00 via Android
    @Shy07 所以说,不要用强弱类型这种没有明确定义的词……从这个意义上来说,Python也是强类型的,只不过带了隐式类型转换
    Exin
        48
    Exin  
       2015-08-10 19:26:10 +08:00
    不懂。但我知道凡是有人说Apple的东西不好的地方,肯定有人洗地。
    Shy07
        49
    Shy07  
       2015-08-10 19:33:34 +08:00
    @jiang42 Python 确实是强类型的 https://en.wikipedia.org/wiki/Python_(programming_language)
    所谓强类型就是不同的类型操作之前需要进行强制转换,强制转换可以是显式的,也可以是隐式的
    jiang42
        50
    jiang42  
       2015-08-10 19:45:33 +08:00 via Android
    @Shy07 我不相信维基百科,请给论文。按照你的定义,有哪个语言是弱类型的呢?

    BTW,在维基百科type system条目里说了,强弱类型没有通用定义
    jiang42
        51
    jiang42  
       2015-08-10 19:46:02 +08:00 via Android
    @Exin 看问题带偏见不是一个好习惯
    Exin
        52
    Exin  
       2015-08-10 20:18:30 +08:00
    @jiang42 什么问题?我根本没看到问题
    rotoava
        53
    rotoava  
       2015-08-10 21:11:45 +08:00 via iPhone
    很讨厌swift。现在对swift的修饰一般说是现代化的编程语言,将来一定替换掉oc,支持函数式风格,苹果帝国支持野心勃勃等。想到python很多人只用一个词修饰-优雅。swift是和优雅不沾边的。太多的地方隐形表示,有些地方反而偏偏要显性表示。还有,尾参,外参、内参,尾参闭包组合起来,一个函数调用就有10种形式,呵呵。闭包定义方式也丑的不行,中间还夹杂一个in,函数都匿名了,加个in多丑。另外一版二版的一些改动就像开玩笑。
    wezzard
        54
    wezzard  
       2015-08-10 21:19:21 +08:00
    這麼多人說 Python 好,我也去學個看看。
    rotoava
        55
    rotoava  
       2015-08-10 21:30:24 +08:00 via iPhone
    被自动类型转化坑过有什么好讲的。不管是否支持自动类型转换,当存在危险的时候你都得有意识注意一下。当你意识一下之后,发现不要紧,且是支持自动类型转换的。所以省事了,直接开心写下一行。难道不是这个思路过程。
    jimages
        56
    jimages  
       2015-08-10 23:14:51 +08:00 via iPhone
    @ibremn py3 赋值试过不加空格 没问题啊
    DingSoung
        57
    DingSoung  
       2015-09-29 13:10:07 +08:00
    LZ 是没被 C 坑过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3901 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 10:22 · PVG 18:22 · LAX 02:22 · JFK 05:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.