最新のSwift 3.0にコードを変換した後、このエラーが表示されました。
CGSize = CGSizeMake(0,0)
の解決策を教えてください
static var frameAtStartOfPan: CGRect = CGRectZero
static var startPointOfPan: CGPoint = CGPointZero
どちらも利用できません。
CGRect
CGPoint
またはCGSize
のインスタンスを使用して簡単に作成できます。
let rect = CGRect(Origin: CGPoint(x: 0,y :0), size: CGSize(width: 100, height: 100))
// Or
let rect = CGRect(Origin: .zero, size: CGSize(width: 100, height: 100))
あるいはCGFloat
、Double
、Int
の各値を指定したい場合は、このメソッドを使用できます。
let rect = CGRect(x: 0, y: 0, width: 100, height: 100) // CGFloat, Double, Int
CGPoint
このように作成することができます。
let point = CGPoint(x: 0,y :0) // CGFloat, Double, Int
CGSize
このように作成することができます。
let size = CGSize(width: 100, height: 100) // CGFloat, Double, Int
値として0を指定してサイズとポイントを指定することもできます。
let size = CGSize.zero // width = 0, height = 0
let point = CGPoint.zero // x = 0, y = 0, equal to CGPointZero
let rect = CGRect.zero // equal to CGRectZero
CGRect.zero
のCGRectZero
&CGPointZero
はCGPoint.zero
&Swift 3.0
に置き換えられました。
CGRectMake、CGPointMake、CGSizeMakeのクイックフィックス in - Swift3&iOS10
これらの拡張機能を追加してください。
extension CGRect{
init(_ x:CGFloat,_ y:CGFloat,_ width:CGFloat,_ height:CGFloat) {
self.init(x:x,y:y,width:width,height:height)
}
}
extension CGSize{
init(_ width:CGFloat,_ height:CGFloat) {
self.init(width:width,height:height)
}
}
extension CGPoint{
init(_ x:CGFloat,_ y:CGFloat) {
self.init(x:x,y:y)
}
}
次に、「 ワークスペース内の検索と置換 」に移動します。検索 CGRectMake、CGPointMake、CGSizeMake およびそれらを CGRect、CGPoint、CGSize に置き換えます。
今のXcodeでは Swift 2+ から Swift 3 への素早い変換ができないため、これらの手順を実行することで時間を節約できます。
Swift 3では、CGRectZero
やCGPointZero
の代わりにCGPoint.zero
またはCGRect.zero
を使うことができます。
しかし、Swift 4では、CGRect.zero
と'CGPoint.zero'
は動きます
Core Graphicsや他のAPIの他のすべてのシンボルと同様に構造もきれいになり、パラメータ名も含まれています。 https://developer.Apple.com/reference/coregraphics#symbols
CGRect(x: Int, y: Int, width: Int, height: Int)
CGVector(dx: Int, dy: Int)
CGPoint(x: Double, y: Double)
CGSize(width: Int, height: Int)
CGPointの例:
let newPoint = stackMid.convert(CGPoint(x: -10, y: 10), to: self)
CGVectorの例:
self.physicsWorld.gravity = CGVector(dx: 0, dy: gravity)
CGSizeの例:
hero.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 16, height: 18))
CGRectの例:
let back = SKShapeNode(rect: CGRect(x: 0-120, y: 1024-200-30, width: 240, height: 140), cornerRadius: 20)
アップルブログ
Swift 3でのSwiftの構文とAPIの名前変更により、言語がより自然に感じられ、Cocoaフレームワークを呼び出す際のSwift-yのエクスペリエンスがさらに向上します。人気のあるフレームワークであるCore GraphicsとGrand Central Dispatchには、Swiftに新しく、よりクリーンなインターフェースがあります。
Swift 2のようにそれらを使いたい場合は、以下の関数を使うことができます。
CGRectMakeの場合:
func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
return CGRect(x: x, y: y, width: width, height: height)
}
CGPointMakeの場合:
func CGPointMake(_ x: CGFloat, _ y: CGFloat) -> CGPoint {
return CGPoint(x: x, y: y)
}
CGSizeMakeの場合:
func CGSizeMake(_ width: CGFloat, _ height: CGFloat) -> CGSize {
return CGSize(width: width, height: height)
}
それらをクラスの外に置くだけで、うまくいくはずです。 (少なくとも私のために働く)
Swift 3 Bonus: なぜ誰もがショートフォームに言及しなかったのですか?
CGRect(Origin: .zero, size: size)
.zero
の代わりにCGPoint.zero
型が定義されたら、それを省略してもかまいません。
以下を試してください。
var myToolBar = UIToolbar.init(frame: CGRect.init(x: 0, y: 0, width: 320, height: 44))
これは Swift's の最新版です
CGRectZeroの代わりにこれを使うことができます
CGRect.zero
Swift 4では 以下のように動作します
collectionView.setContentOffset(CGPoint.zero, animated: true)
CGSize用
CGSize(width: self.view.frame.width * 3, height: self.view.frame.size.height)