Upload
hirohito-kato
View
36
Download
0
Embed Size (px)
Citation preview
• try! Swift 2016
Swift (@RGfox)
• ( )
let x = 32let y = 120.0let w = Float(44.0)let h = CGFloat(24)
view.rect = CGRect(x: x, y: y, width: w,
let x = 32let y = 120.0let w = Float(44.0)let h = CGFloat(24)
view.rect = CGRect(x: x, y: y, width: w, height: h)
let x = 32let y = 120.0let w = Float(44.0)let h = CGFloat(24)
view.rect = CGRect(x: x, y: y, width: w, height: h)// ERROR!
let x = 32let y = 120.0let w = Float(44.0)let h = CGFloat(24)
view.rect = CGRect(x: x, y: y, width: w, height: h)// ERROR!
let x = 32let y = 120.0let w = Float(44.0)let h = CGFloat(24)
view.rect = CGRect(x: CGFloat(x), y: CGFloat(y),
let x = 32let y = 120.0let w = Float(44.0)let h = CGFloat(24)
view.rect = CGRect(x: CGFloat(x), y: CGFloat(y), width: CGFloat(w),
let x = 32let y = 120.0let w = Float(44.0)let h = CGFloat(24)
view.rect = CGRect(x: CGFloat(x), y: CGFloat(y), width: CGFloat(w), height: h)
let x = 32let y = 120.0let w = Float(44.0)let h = CGFloat(24)
view.rect = CGRect(x: CGFloat(x), y: CGFloat(y), width: CGFloat(w), height: h)// OK
let x = 32let y = 120.0let w = Float(44.0)let h = CGFloat(24)
view.rect = CGRect(x: CGFloat(x), y: CGFloat(y), width: CGFloat(w), height: h)// OK
extension Double { var cgf:CGFloat { return CGFloat(self) } } extension Int { var cgf:CGFloat { return CGFloat(self) } } extension Float { var cgf:CGFloat { return CGFloat(self) } }
extension Double {var c:CGFloat { return CGFloat(self) }
}extension Int {
var c:CGFloat { return CGFloat(self) }}extension Float {
var c:CGFloat { return CGFloat(self) }}extension Float80 {
var c:CGFloat { return CGFloat(self) }}extension UInt {
var c:CGFloat { return CGFloat(self) }}extension UInt8 {
var c:CGFloat { return CGFloat(self) }}extension UInt16 {
var c:CGFloat { return CGFloat(self) }}extension UInt32 {
var c:CGFloat { return CGFloat(self) }}
extension UInt64 {var c:CGFloat { return CGFloat(self) }
}extension Int8 {
var c:CGFloat { return CGFloat(self) }}extension Int16 {
var c:CGFloat { return CGFloat(self) }}extension Int32 {
var c:CGFloat { return CGFloat(self) }}extension Int64 {
var c:CGFloat { return CGFloat(self) }}extension UInt64 {
var c:CGFloat { return CGFloat(self) }}extension MyNumberType {
var c:CGFloat { return CGFloat(self) }}extension MyNumberTypeB {
var c:CGFloat { return CGFloat(self) }}
:
…
CGFloat
public struct CGFloat { public init() public init(_ value: Float) public init(_ value: Double) public init(_ value: Float80) public init(_ value: CGFloat) public init(_ value: UInt8) public init(_ value: Int8) :
Swift protocol
• init
•
protocol CGFConvertible { init (_ value: Int) init (_ value: Float) init (_ value: Double) init (_ value: CGFloat) } // extension Int: CGFConvertible {} extension Float: CGFConvertible {} extension Double: CGFConvertible {} extension CGFloat: CGFConvertible {}
•
… Swift
extension CGFConvertible { fileprivate func convert <T: CGFConvertible>() -> T { return T(self) } }
func checkType<T>(_ x: T) { switch x { case _ as CGFloat: print("\(x) is a CGFloat") case _ as Float: print("\(x) is a Float") case _ as Int: print("\(x) is a Int") case _ as Double: print("\(x) is a Double") default: print("\(x) is unknown..") } }
Swift Workaround
RTTI
extension CGFConvertible { fileprivate func convert<T: CGFConvertible>() -> T { switch self { case let x as CGFloat: return T(x) case let x as Float: return T(x) case let x as Int: return T(x) case let x as Double: return T(x) default: fatalError("Unsupported format") } } public var c: CGFloat { return convert() } }
K
extension CGFConvertible { private typealias CombineType = (Double,Double) -> Double fileprivate func operate<T:CGFConvertible, V:CGFConvertible> (b:T, combine: CombineType) -> V { let x:Double = self.convert() let y:Double = b.convert() return combine(x,y).convert() } }
func + <T:CGFConvertible, U:CGFConvertible,V:CGFConvertible> (lhs: T, rhs: U) -> V { return lhs.operate(b: rhs, combine: + ) } func - <T:CGFConvertible, U:CGFConvertible,V:CGFConvertible> (lhs: T, rhs: U) -> V { return lhs.operate(b: rhs, combine: - ) }
a.
protocol CGFConvertible { init (_ value: Int) init (_ value: Float) init (_ value: Double) init (_ value: CGFloat) }
extension Int: CGFConvertible {} extension Float: CGFConvertible {} extension Double: CGFConvertible {} extension CGFloat: CGFConvertible {}
extension CGFConvertible { fileprivate func convert<T: CGFConvertible>() -> T { return T(x) } }
•
b.
extension CGFConvertible { private typealias CombineType = (Double,Double) -> Double fileprivate func operate<T:CGFConvertible, V:CGFConvertible> (b:T, combine: CombineType) -> V { let x:Double = self.convert() let y:Double = b.convert() return combine(x,y).convert() } } func + <T:CGFConvertible, U:CGFConvertible,V:CGFConvertible> (lhs: T, rhs: U) -> V { return lhs.operate(b: rhs, combine: + ) } func - <T:CGFConvertible, U:CGFConvertible,V:CGFConvertible> (lhs: T, rhs: U) -> V { return lhs.operate(b: rhs, combine: - ) } func * <T:CGFConvertible, U:CGFConvertible,V:CGFConvertible> (lhs: T, rhs: U) -> V { return lhs.operate(b: rhs, combine: * ) }
•
• CGFloat
• CGFloat
• Round up a CGFloat in Swift
• Swift