8968


swift1.2での質問です。  
<http://qiita.com/phptaro/items/83e345ebab457a35d006>  
このサイトを参考にさせていただき、コードを書いていました。  
swift1.2になってから、以下のコードの部分でエラーができるようになってしまいました。

> Overriding method with selector 'touchesBegan:withEvent:' has incompatible
> type '(NSSet, UIEvent) -> ()'  
>  Overriding method with selector 'touchesMoved:withEvent:' has incompatible
> type '(NSSet, UIEvent) -> ()'
[code]

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        lastPoint = touches.anyObject()?.locationInView(self)
    }
    
    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        var newPoint = touches.anyObject()?.locationInView(self)
        lines.append(Line(start: lastPoint, end: newPoint!))
        lastPoint = newPoint
    
        self.setNeedsDisplay()
    
    }
    
[/code]

いくつか他のサイトを参考にさせていただき、

[code]

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {..}
    override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {..}
    
[/code]

に書き換えたのですが、なかなかnewPointやlastPointと型が合わずに困っています。  
教えていただけたら幸いです。お願いします。

補足：Lineのクラスはこのようになっています。

[code]

    class Line {
    var start: CGPoint
    var end: CGPoint
    
    init(start _start: CGPoint, end _end:CGPoint){
        start = _start
        end = _end
    }}
    
[/code]


CC BY-SA 3.0
2015-04-09T16:12:21.880
8963
2015-04-09T22:51:50.687
question
ios objective-c swift
swift 1.2でのtouchesの処理


以下のコードを参考にしてください。

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
            let touch = touches.first as? UITouch
            var position = CGPointZero
            if let _touch = touch {
                position = _touch.locationInView(self.view)
            }
            println("Touch Position = \(position)")
        }
    
    }
    
[/code]

ポイントは、

  1. 型Setには、NSSetクラスの「anyObject()」に対応するメソッド、プロパティが存在しない。上記コードでは、Set「touches」の先頭メンバー（`first`）を取り出している。
  2. `touchesBegan`、`touchesMoved`の引数では、Setの要素の型が「NSObject」になります。NSObjectには、`locationInView()`というメソッドがないので、エラーが出ます。正しくNSObjectをUITouchクラスに型キャストする必要があります。C言語、Objective-Cでは、暗黙的な型キャストをしてくれた場面でも、Swiftでは、手動で明示的な型キャストをする必要が出てきます。
  3. これはおまけですが、Optional型変数に対応した処理もするようにしてください。Setの要素は、ここではOptional型です。


CC BY-SA 3.0
2015-04-09T22:51:50.687
8968
2015-04-09T22:51:50.687
7362
8963
answer