Вам необходимо вывести свои функции 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()
Статья Википедии о стратегии оценки предполагает, что call-by-value-result поддерживается Фортраном. Вызов по имени поддерживается Алголом 68.
Я думаю, что Макросы C являются Передачей по имени (не сам язык C, конечно). Я не знаю ни о каких pass-by-value-result языках, я боюсь (чтобы быть честным, я должен был сделать веб-поиск для обнаружения то, что это означает!).
если Вы передаете переменную функции Фортрана, и Вы изменяете ее там, Вы также изменяете ее в программе вызова:
psuedocode:
int j = 1
print j
addOne(j)
print j
произвел бы:
1
2
И Java и C являются языком передачи значением.
C является ясно передачей языком значения.
Java всегда является сказанными "примитивами, передаются значением, объекты передаются ссылкой". Но так как объект Java является ссылкой в любое время, таким образом, это - на самом деле ссылочное значение.
Спецификация языка Java говорит это: http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#37472
Я думаю, что язык экспертной системы CLIPS был бы передачей по имени.
Алгол поддерживает передачу по имени, поскольку вы можете найти объяснение здесь
Мне сказали, что Ада поддерживает передачу по значению / результату, но еще не пробовал.