一つのアプローチを使用することができ、回避策のように見えない解決策を探しています可能性がありDelegate
パターン。これにより、Array
に何かが追加または削除されたときに呼び出されるデリゲートメソッドが公開されます。 ViewController
は、Delegate
プロトコルに準拠し、ボタンの有効な状態を管理できます。
例:
MyArrayDelegate.swift
protocol MyArrayDelegate: class {
func didChange(_ myArray: MyArray)
}
MyArray.swift
class MyArray {
weak var delegate: MyArrayDelegate?
private var _myArray = [Int]()
var myArray: [Int] {
return _myArray
}
func append(_ element: Int) {
_myArray.append(element)
delegate?.didChange(self)
}
func remove(at index: Int) -> Int {
let element = _myArray.remove(at: index)
delegate?.didChange(self)
return element
}
}
append(_:)
およびremove(at:)
は、標準のArray
メソッドをラップするだけです。
append(_:)
またはremove(at:)
方法がインスタンスで呼び出されるたびViewController.swift
class ViewController: UIViewController, MyArrayDelegate {
@IBOutlet weak var myButton: UIButton!
private var myArray = MyArray()
override func viewDidLoad() {
super.viewDidLoad()
myArray.delegate = self
myButton.isEnabled = false
}
@IBAction func buttonTapped(_ sender: Any) {
print(myArray.myArray.count)
}
@IBAction func addButtonTapped(_ sender: Any) {
myArray.append(1)
}
@IBAction func removeButtonTapped(_ sender: Any) {
if myArray.myArray.count > 0 {
_ = myArray.remove(at: 0)
}
}
func didChange(_ myArray: MyArray) {
if myArray.myArray.count > 0 {
myButton.isEnabled = true
} else {
myButton.isEnabled = false
}
}
}
didChange(_:)
が呼び出されます。
例ユーザーインタフェース
当初は "ボタン" が無効です。 「+」をタップすると、有効になります。 「+」をタップし続けると、「ボタン」は有効のままです。 「削除」をタップすると、1つの要素がアレイから削除されます。すべての要素が配列から削除された場合、 "Button"は無効になります。