Передача по имени и передача языками результата значения

Вам необходимо вывести свои функции observeValueForKeyPath:ofObject:change:context и updateLine из функции loadView().

Функция observeValueForKeyPath:ofObject:change:context нуждается в переопределении на уровне ViewController, так как вы добавили наблюдателя на self, который в данном случае является контроллером представления.

См. Ниже:

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    private var animator: UIDynamicAnimator?
    private var gravity: UIGravityBehavior?
    private var attach: UIAttachmentBehavior?
    private var plateView: UIView?

    var lineLayer: CAShapeLayer?

    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white
        self.view = view

        plateView = UIView(frame: CGRect(x: 80, y: 150, width: 60, height: 60))
        plateView?.backgroundColor = UIColor.orange
        self.view.addSubview(plateView!)

        animator = UIDynamicAnimator(referenceView: view)

        gravity = UIGravityBehavior(items: [plateView!])
        animator?.addBehavior(gravity!)

        attach = UIAttachmentBehavior(item: plateView!, offsetFromCenter: UIOffset(horizontal: 0, vertical: -30), attachedToAnchor: CGPoint(x: 200, y: 100))

        attach?.damping = 0.1
        attach?.frequency = 0.6
        animator?.addBehavior(attach!)

        plateView?.addObserver(self, forKeyPath: "center", options: .new, context: nil)
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        updateLine()
    }

    func updateLine() {
        if nil == lineLayer {
            lineLayer = CAShapeLayer()
            lineLayer?.strokeColor = UIColor.purple.cgColor
            lineLayer?.fillColor = UIColor.clear.cgColor
            lineLayer?.lineWidth = 1.5
            lineLayer?.lineJoin = .round
            lineLayer?.strokeEnd = 1.0
            self.view.layer.addSublayer(lineLayer!)
        }

        let platePoint = view.convert(CGPoint(x: plateView!.bounds.midX, y: 0), from: plateView)
        let bezierPath = UIBezierPath()
        bezierPath.move(to: attach!.anchorPoint)
        bezierPath.addLine(to: platePoint)
        lineLayer?.path = bezierPath.cgPath
    }

}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
6
задан dancavallaro 5 April 2009 в 00:45
поделиться

6 ответов

Статья Википедии о стратегии оценки предполагает, что call-by-value-result поддерживается Фортраном. Вызов по имени поддерживается Алголом 68.

3
ответ дан 17 December 2019 в 02:33
поделиться

Я думаю, что Макросы C являются Передачей по имени (не сам язык C, конечно). Я не знаю ни о каких pass-by-value-result языках, я боюсь (чтобы быть честным, я должен был сделать веб-поиск для обнаружения то, что это означает!).

1
ответ дан 17 December 2019 в 02:33
поделиться

если Вы передаете переменную функции Фортрана, и Вы изменяете ее там, Вы также изменяете ее в программе вызова:

psuedocode:

int j = 1
print j
addOne(j)
print j

произвел бы:

1
2
1
ответ дан 17 December 2019 в 02:33
поделиться

И Java и C являются языком передачи значением.

C является ясно передачей языком значения.

Java всегда является сказанными "примитивами, передаются значением, объекты передаются ссылкой". Но так как объект Java является ссылкой в любое время, таким образом, это - на самом деле ссылочное значение.

Спецификация языка Java говорит это: http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#37472

0
ответ дан 17 December 2019 в 02:33
поделиться

Я думаю, что язык экспертной системы CLIPS был бы передачей по имени.

1
ответ дан 17 December 2019 в 02:33
поделиться

Алгол поддерживает передачу по имени, поскольку вы можете найти объяснение здесь

Мне сказали, что Ада поддерживает передачу по значению / результату, но еще не пробовал.

0
ответ дан 17 December 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: