kalintw
V2EX  ›  Swift

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

  •  
  •   kalintw · Aug 10, 2015 · 6751 views
    This topic created in 3940 days ago, the information mentioned may be changed or developed.
    土鳖对此表示不解,如此酸爽?
    57 replies    2015-09-29 13:10:07 +08:00
    qdwang
        1
    qdwang  
       Aug 10, 2015 via Android
    猜测lz很喜欢js
    wangyifei6817
        2
    wangyifei6817  
       Aug 10, 2015
    js写多了不适应强类型吧?
    kalintw
        3
    kalintw  
    OP
       Aug 10, 2015
    @qdwang
    @wangyifei6817

    各位大哥,强类型的C语言也不是这么玩的吧。
    Int乘以Double,还非得Double(Int)一下,哎
    cz208209
        4
    cz208209  
       Aug 10, 2015
    @kalintw 同意 C也有自动转换
    ipconfiger
        5
    ipconfiger  
       Aug 10, 2015
    没有被自动转换坑过?
    zylll520
        6
    zylll520  
       Aug 10, 2015
    思路不一样,Swift 倒有点像把大家都约定好的格式全部省略,把隐藏的格式明显标示
    publicID001
        7
    publicID001  
       Aug 10, 2015 via Android   ❤️ 1
    @kalintw C 是弱类型的
    kalintw
        8
    kalintw  
    OP
       Aug 10, 2015
    @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  
       Aug 10, 2015
    @kalintw 我一直以为:

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

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

    Swift 是一個講究 code level safety 的語言,不像 C 充分信賴程序員。
    FrankFang128
        16
    FrankFang128  
       Aug 10, 2015 via Android
    圣战
    kalintw
        17
    kalintw  
    OP
       Aug 10, 2015
    @wezzard
    @zylll520

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

    go也是这样
    jaminzzhang
        20
    jaminzzhang  
       Aug 10, 2015
    swift的书上有专门的介绍,可以认真看看书。楼上已经有人回答了,看来LZ真的没有被自动类型转换坑过
    Perry
        21
    Perry  
       Aug 10, 2015 via iPhone
    有个 IDE(Xcode)不是多大事情吧 8 楼的例子
    wezzard
        22
    wezzard  
       Aug 10, 2015
    單單以爲方便就是好的設計,我也瞬間感覺甚麼都說不出。
    likid
        23
    likid  
       Aug 10, 2015
    var c= Double(x) + y // Error, Prefix/postfix '=' is reserved
    dorentus
        24
    dorentus  
       Aug 10, 2015
    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  
       Aug 10, 2015
    楼组应该学一学编译原理
    ibremn
        26
    ibremn  
       Aug 10, 2015
    @kalintw
    8楼没用过 Python 吗。。少个空格试试╮( ̄▽ ̄")╭
    jiang42
        27
    jiang42  
       Aug 10, 2015 via Android
    @kalintw 在我看来,C不是强类型语言。BTW, 强弱类型并没有一个明确的定义。所以最好不要说某语言是强类型。

    Swift的设计没啥问题。

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

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

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

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

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

    当1.0+1!=2的时候你会感谢显式类型转换的
    Shy07
        46
    Shy07  
       Aug 10, 2015
    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  
       Aug 10, 2015 via Android
    @Shy07 所以说,不要用强弱类型这种没有明确定义的词……从这个意义上来说,Python也是强类型的,只不过带了隐式类型转换
    Exin
        48
    Exin  
       Aug 10, 2015
    不懂。但我知道凡是有人说Apple的东西不好的地方,肯定有人洗地。
    Shy07
        49
    Shy07  
       Aug 10, 2015
    @jiang42 Python 确实是强类型的 https://en.wikipedia.org/wiki/Python_(programming_language)
    所谓强类型就是不同的类型操作之前需要进行强制转换,强制转换可以是显式的,也可以是隐式的
    jiang42
        50
    jiang42  
       Aug 10, 2015 via Android
    @Shy07 我不相信维基百科,请给论文。按照你的定义,有哪个语言是弱类型的呢?

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