Член экземпляра нельзя использовать для типа «ViewController» в Xcode 9 [duplicate]

@Zeb ответ велик, но просто очистить его и сделать его немного более осторожным. Вычислимые свойства только для чтения должны избегать использования get и return Void избыточно:

typealias GradientPoints = (startPoint: CGPoint, endPoint: CGPoint)

enum GradientOrientation {
  case topRightBottomLeft
  case topLeftBottomRight
  case horizontal
  case vertical

var startPoint: CGPoint {
    return points.startPoint
}

var endPoint: CGPoint {
    return points.endPoint
}

var points: GradientPoints {
    switch self {
    case .topRightBottomLeft:
        return (CGPoint.init(x: 0.0, y: 1.0), CGPoint.init(x: 1.0, y: 0.0))
    case .topLeftBottomRight:
        return (CGPoint.init(x: 0.0, y: 0.0), CGPoint.init(x: 1, y: 1))
    case .horizontal:
        return (CGPoint.init(x: 0.0, y: 0.5), CGPoint.init(x: 1.0, y: 0.5))
    case .vertical:
        return (CGPoint.init(x: 0.0, y: 0.0), CGPoint.init(x: 0.0, y: 1.0))
    }
  }
}

extension UIView {

func applyGradient(withColours colours: [UIColor], locations: [NSNumber]? = nil) {
    let gradient: CAGradientLayer = CAGradientLayer()
    gradient.frame = self.bounds
    gradient.colors = colours.map { $0.cgColor }
    gradient.locations = locations
    self.layer.insertSublayer(gradient, at: 0)
}

func applyGradient(withColours colours: [UIColor], gradientOrientation orientation: GradientOrientation) {
    let gradient: CAGradientLayer = CAGradientLayer()
    gradient.frame = self.bounds
    gradient.colors = colours.map { $0.cgColor }
    gradient.startPoint = orientation.startPoint
    gradient.endPoint = orientation.endPoint
    self.layer.insertSublayer(gradient, at: 0)
  }
}
7
задан Nicholas L. 1 December 2015 в 19:52
поделиться

2 ответа

Если код, который вы вставили, не определен в методе, подобном viewDidLoad, вы не можете использовать переменную, определенную на уровне класса, для другой переменной, которая также определена на уровне класса. Эти переменные определяются во время выполнения, и порядок, который они определяют, неизвестен, поэтому fortuneArray может не существовать до того, как будет сделан случайный случай (возможно, это не так работает за кулисами, но вы можете думать об этом таким образом, по крайней мере)

вы должны вычислить эти переменные внутри viewDidLoad или init или какой-либо другой функции вместо

13
ответ дан Fonix 20 August 2018 в 11:29
поделиться
  • 1
    Спасибо, это полезно. Однако я использую «randomIndex» в IBAction. Возможно, мне следовало бы разместить больше моего кода, но если я объявлю переменную в viewDidLoad, как вы сказали, я могу использовать ее только в этой области, я полагаю. – Nicholas L. 1 December 2015 в 17:58
  • 2
    Я добавил больше кода, чтобы упростить работу. – Nicholas L. 1 December 2015 в 18:12
  • 3
    Не можете ли вы объявить переменные lazy, как описано Мартином R в этом ответе? [Д0] stackoverflow.com/questions/25854300/… – Crashalot 23 February 2016 в 18:41
  • 4
    @Crashalot, я думаю, что работает только в этом случае, потому что начальные значения переменных, используемых в ленивом загружаемом переменном arent, рассчитанные во время выполнения, верят, что 2 ленивых загруженных переменных не смогут опираться друг на друга таким образом, как в оригинале вопрос, так как это будет похоже на цикл зависимостей. havnt проверил его вообще, поэтому, возможно, неправильно – Fonix 24 February 2016 в 02:59

Ах, я понял это с помощью Фоникса. Я объявил случайное число в IBAction и позаботился об этом.

0
ответ дан Nicholas L. 20 August 2018 в 11:29
поделиться
Другие вопросы по тегам:

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