Xcode производит "Ошибка сегментации: 11" компиляция - PullRequest
1 голос
/ 22 февраля 2020

При компиляции следующего кода Xcode версии 11.3.1 (11C504) выдает:
"error: Ошибка сегментации: 11 (в целевом 'TestDel3' из проекта 'TestDel3')"

Если я комментирую out Image(systemName: systemName) и замените его на Image(systemName: "person"), оно компилируется

struct ContentView: View{
  var body: some View {
    UseButtonContainer( b: ButtonContainer("x1",systemName:"person") {print("c1")})
  }
}

struct UseButtonContainer: View{
  let b : ButtonContainer
  var body: some View {
    Button(action: {
      self.b.action();
      self.extraAction()
    }) { b.label}
  }

  func extraAction()->Void{
    print("extra action")
  }
}

struct ButtonContainer{
  let label: VStack<TupleView<(Image, Text)>>
  let action: ()-> Void

  init(_ text: String, systemName: String, action: @escaping ()-> Void){
    self.label = VStack{
      Image(systemName: systemName)     // Commenting out this line
      //Image(systemName: "person")     // and using this instead, it compiles
      Text(text)
    }
    self.action = action
  }
}

What's wrong here?

1 Ответ

1 голос
/ 22 февраля 2020

Обновление: работает следующий вариант

struct ButtonContainer{
  let label: VStack<TupleView<(Image, Text)>>
  let action: ()-> Void

  init(_ text: String, systemName: String, action: @escaping ()-> Void){
    self.label = VStack {
      Image(systemName: "\(systemName)") // << make it string literal !!!
      Text(text)
    }
    self.action = action
  }
}

Начальный (на всякий случай):

Учитывая, что SwiftUI использует почти везде непрозрачные типы some View, подход с типом стирания для label скомпилирован и хорошо работает (проверено с Xcode 11.3.1 / iOS 13.3). Я не уверен, что вам нужно иметь явный тип здесь, но просто помните.

struct ButtonContainer{
  let label: AnyView
  let action: ()-> Void

  init(_ text: String, systemName: String, action: @escaping ()-> Void){
    self.label = AnyView(VStack {
      Image(systemName: systemName)
      Text(text)
    })
    self.action = action
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...