Swift 4: невозможно использовать элемент экземпляра 'MAIN_URL' в инициализаторе свойства при попытке объединить две строки - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь объединить строковую переменную с текстом, но получаю эту ошибку:

import UIKit
public class GlobalClass {
  private let MAIN_URL = "http://example.com"
  private let GET_TOKEN_URL = URL(string: MAIN_URL + "loginUser") //here I get: Cannot use instance member 'MAIN_URL' within property initializer; property initializers run before 'self' is available
}

Есть ли способ исправить это?Я пытаюсь объявить эти константы в глобальном файле swift, чтобы они были доступны из других классов.Я знаю, что они являются частными, но я смогу получить их ценность, используя геттеры.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вам нужно либо сделать оба свойства static, либо сделать GET_TOKEN_URL ленивым.Это обеспечит доступ инициализатора свойства к self к моменту первого обращения к свойству.

static подход:

public class GlobalClass {
  private static let MAIN_URL = "http://example.com"
  private static let GET_TOKEN_URL = URL(string: GlobalClass.MAIN_URL + "loginUser")
}

lazy подход:

public class GlobalClass {
  private let MAIN_URL = "http://example.com"
  private lazy var GET_TOKEN_URL = URL(string: MAIN_URL + "loginUser")
}

Вы должны также соблюдать соглашение об именах Swift, которое для имен переменных является lowerCamelCase, поэтому mainUrl и getTokenUrl.

0 голосов
/ 29 ноября 2018

Я думаю, что вам нужно

struct Globals {
    static let MAIN_URL = "http://example.com/"
    static let GET_TOKEN_URL = URL(string: Globals.MAIN_URL + "loginUser") //here I get: Cannot use instance member 'MAIN_URL' within property initializer; property initializers run before 'self' is available
}

MAIN_URL не входит в сферу, что позволяет вам использовать его напрямую, как MAIN_URL, в вашем случае вы можете сделать

private let GET_TOKEN_URL = URL(string: GlobalClass().MAIN_URL + "loginUser")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...