Код доступа с ошибкой TouchiD "Тип неоднозначен без дополнительного контекста"

Я использую некоторый код из github и пытаюсь конвертировать его в Swift 3.0. Я сделал все до сих пор, но я получаю эту одну ошибку на 3 строки в коде:

Тип выражения неоднозначен без дополнительного контекста

Ниже я отметил линии, помеченные этой ошибкой. Как мне исправить это? Все остальное работает, что я знаю. Я просто не могу протестировать само демо, пока это не исправлено.

//
//  PasscodeSettingsViewController.swift
//  PasscodeLockDemo
//
//  Created by Yanko Dimitrov on 8/29/15.
//  Copyright © 2015 Yanko Dimitrov. All rights reserved.
//

import UIKit
import PasscodeLock

class PasscodeSettingsViewController: UIViewController {
    @IBOutlet weak var passcodeSwitch: UISwitch!
    @IBOutlet weak var changePasscodeButton: UIButton!
    @IBOutlet weak var testTextField: UITextField!
    @IBOutlet weak var testActivityButton: UIButton!

    fileprivate let configuration: PasscodeLockConfigurationType

    init(configuration: PasscodeLockConfigurationType) {
        self.configuration = configuration

        super.init(nibName: nil, bundle: nil)
    }

    @IBAction func passcodeSwitchValueChange(_ sender: UISwitch) {
        let passcodeVC: PasscodeLockViewController

        if passcodeSwitch.isOn {
            // Error on next line
            passcodeVC = PasscodeLockViewController(state: .SetPasscode, configuration: configuration)
        } else {

            // Error on next line
            passcodeVC = PasscodeLockViewController(state: .RemovePasscode, configuration: configuration)

            passcodeVC.successCallback = { lock in

                lock.repository.deletePasscode()
            }
        }

        present(passcodeVC, animated: true, completion: nil)
    }

    @IBAction func changePasscodeButtonTap(_ sender: UIButton) {
        let repo = UserDefaultsPasscodeRepository()
        let config = PasscodeLockConfiguration(repository: repo)

        let passcodeLock = PasscodeLockViewController(state: .ChangePasscode, configuration: config) 

        // Error on next line
        presentViewController(passcodeLock, animated: true, completion: nil)
    }
}

1 ответ

Решение

Основная ветка репо содержит предыдущую версию Swift. После автоматического преобразования (когда вы впервые клонируете проект и открываете его с помощью XCode, и XCode запрашивает преобразование в текущий синтаксис Swift), LockState перечисление внутри PasscodeLockViewController класс становится:

public enum LockState {
    case enterPasscode
    case setPasscode
    case changePasscode
    case removePasscode

    func getState() -> PasscodeLockStateType {

        switch self {
        case .enterPasscode: return EnterPasscodeState()
        case .setPasscode: return SetPasscodeState()
        case .changePasscode: return ChangePasscodeState()
        case .removePasscode: return EnterPasscodeState(allowCancellation: true)
        }
    }
}

В демонстрационном проекте, в котором вы создаете экземпляр, вы используете: (Здесь регистр перечисления указан в верхнем регистре как .SetPasscode)

passcodeVC = PasscodeLockViewController(state: .SetPasscode, configuration: configuration)

Вы должны изменить эту инициализацию на:

passcodeVC = PasscodeLockViewController(state: .setPasscode, configuration: configuration)

И для других повторяющихся ошибок того же типа в XCode, вы должны изменить их соответственно.

Другие вопросы по тегам