对于数学运算 Swfit 不自动提升和转换类型,这难道不是脑残的设计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kalintw
V2EX    Swift

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

  •  
  •   kalintw 2015-08-10 08:27:34 +08:00 6344 次点击
    这是一个创建于 3722 天前的主题,其中的信息可能已经有所发展或是发生改变。
    土鳖对此表示不解,如此酸爽?
    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)一下,哎
    cz208209
        4
    cz208209  
       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 &nbp;
       2015-09-29 13:10:07 +08:00
    LZ 是没被 C 坑过
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2810 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 06:33 PVG 14:33 LAX 23:33 JFK 02:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86