Swift numerics and CGFloat (CGPoint, CGRect, etc.)

后端 未结 3 594
轻奢々
轻奢々 2020-12-01 02:07

I\'m finding Swift numerics particularly clumsy when, as so often happens in real life, I have to communicate with Cocoa Touch with regard to CGRect and CGPoint (e.g., becau

相关标签:
3条回答
  • 2020-12-01 02:13

    Explicitly typing scale to CGFloat, as you have discovered, is indeed the way handle the typing issue in swift. For reference for others:

    let scale: CGFloat = 2.0
    let r = self.view.bounds
    var r2 = CGRect()
    r2.size.width = r.width * scale
    

    Not sure how to answer your second question, you may want to post it separately with a different title.

    Update:

    Swift creator and lead developer Chris Lattner had this to say on this issue on the Apple Developer Forum on July 4th, 2014:

    What is happening here is that CGFloat is a typealias for either Float or Double depending on whether you're building for 32 or 64-bits. This is exactly how Objective-C works, but is problematic in Swift because Swift doesn't allow implicit conversions.

    We're aware of this problem and consider it to be serious: we are evaluating several different solutions right now and will roll one out in a later beta. As you notice, you can cope with this today by casting to Double. This is inelegant but effective :-)

    Update In Xcode 6 Beta 5:

    A CGFloat can be constructed from any Integer type (including the sized integer types) and vice-versa. (17670817)

    0 讨论(0)
  • 2020-12-01 02:33

    I wrote a library that handles operator overloading to allow interaction between Int, CGFloat and Double.

    https://github.com/seivan/ScalarArithmetic

    As of Beta 5, here's a list of things that you currently can't do with vanilla Swift. https://github.com/seivan/ScalarArithmetic#sample

    I suggest running the test suite with and without ScalarArithmetic just to see what's going on.

    0 讨论(0)
  • 2020-12-01 02:37

    I created an extension for Double and Int that adds a computed CGFloatValue property to them.

    extension Double {
        var CGFloatValue: CGFloat {
            get {
                return CGFloat(self)
            }
        }
    }
    extension Int {
        var CGFloatValue: CGFloat {
            get {
                return CGFloat(self)
            }
        }
    }
    

    You would access it by using let someCGFloat = someDoubleOrInt.CGFloatValue

    Also, as for your CGRect Initializer, you get the missing argument labels error because you have left off the labels, you need CGRect(x: d, y: d, width: d, height: d) you can't leave the labels out unless there is only one argument.

    0 讨论(0)
提交回复
热议问题