Alle Open-Source-Pakete
KISwift

educationai

Swift-Package für Lern-Apps: FSRS-6-Spaced-Repetition, Lernwarteschlange, Abgleich getippter Antworten und Quizze.

2SterneNeueste Version: v2.0.0 · Aktualisiert: 15. Oktober 2026
Plattformen:iOS 17macOS 14tvOS 17watchOS 10visionOS 1

Lizenz: MIT

Zusammenfassung

  • Lernlogik für Karteikarten-Apps: FSRS-6-Spaced-Repetition, eine Lernwarteschlange, Bewertung getippter Antworten und Quizze.
  • Die Tests spielen 2.400 Wiederholungen aus py-fsrs 6.3.2 in acht Konfigurationen nach und vergleichen die Ergebnisse nach jeder Wiederholung.
  • SM2Scheduler hält SM-2-Daten nutzbar und konvertiert SM-2-Karten nach FSRS, wobei das Fälligkeitsdatum jeder Karte erhalten bleibt.
  • Es läuft auf dem Gerät nur mit Foundation, ist für Swift 6 Strict Concurrency geschrieben und enthält kein neuronales Netz.
  • 124 Tests in 11 Suites bestanden beim Tag v2.0.0 mit Swift 6.4 auf macOS 27.0.1.

EducationAI enthält die Lernlogik einer Karteikarten- oder Lern-App. FSRSScheduler entscheidet mit FSRS-6, dem Gedächtnismodell hinter dem FSRS-Scheduler von Anki, wann jede Karte wiederkommt; seine Tests vergleichen 2.400 Wiederholungen mit der Referenzimplementierung py-fsrs 6.3.2. SM2Scheduler hält SM-2-Daten lauffähig und konvertiert sie zu FSRS. Um den Scheduler herum gibt es eine Lernwarteschlange, die Bewertung getippter Antworten mit Tippfehlertoleranz, Quizze, einen Schwierigkeitsanpasser, eine Arbeitslastprognose, Wiederholungsstatistiken und Lernserien. Es läuft auf dem Gerät, nutzt nur Foundation und ist für Swift 6 strict concurrency geschrieben. Ein neuronales Netz steckt nicht darin: FSRS ist ein statistisches Gedächtnismodell.

Funktionen

  • FSRS-6 gegen die Referenz geprüft: Die Tests spielen 2.400 von py-fsrs 6.3.2 berechnete Wiederholungen in acht Konfigurationen ab und vergleichen nach jeder Wiederholung Stabilität, Schwierigkeit, Fälligkeitsdatum und Abrufwahrscheinlichkeit
  • Lern- und Wiederlernschritte, gewünschte Retention, maximales Intervall, Intervall-Fuzz und eigene Gewichte (21 aus FSRS-6 oder 19 aus FSRS-5); eine Vorschau aller vier Bewertungen für die Antwort-Buttons
  • SM-2 wie veröffentlicht sowie eine Konvertierung von SM-2-Karten zu FSRS, die das Fälligkeitsdatum jeder Karte beibehält
  • Bewertung getippter Antworten, die Groß- und Kleinschreibung, Akzente, Zeichenbreite und Satzzeichen ignoriert, ohne von der Gerätesprache abzuhängen, Tippfehler abhängig von der Antwortlänge verzeiht und bei feindlichen Eingaben nur begrenzten Aufwand betreibt
  • Multiple-Choice- und Tipp-Quizze, aus Karten erzeugt; jedes Ergebnis schlägt eine Bewertung für den Scheduler vor, und ein gespeichertes Quiz wird beim Laden erneut bewertet
  • Eine Lernwarteschlange mit Tageslimits, einer Prognose pro Tag, Retentionsstatistiken, Serien nach den Kalendertagen der Lernenden und einem Schwierigkeitsanpasser, der die Trefferquote in einem Zielband hält
  • Sendable-, Codable-Werttypen: Jede Funktion nimmt das Datum entgegen, mit dem sie arbeitet, Zufall stammt aus einem Generator, den Sie seeden können, und gespeicherte Werte werden vor der Verwendung geprüft, statt abzustürzen
  • Keine Abhängigkeiten, nur Foundation; DocC-Referenz mit vier Anleitungen und die Beispiel-App StudyDeck für iOS und macOS

Schnellstart

swift
1struct FlashcardsView: View {
2 @State private var cards = [
3 Flashcard(front: "Capital of Japan", back: "Tokyo"),
4 Flashcard(front: "Capital of Kenya", back: "Nairobi"),
5 Flashcard(front: "Capital of Peru", back: "Lima")
6 ]
7 @State private var showsAnswer = false
8 private let scheduler = FSRSScheduler.default
9 
10 var body: some View {
11 if let card = StudyQueue.cards(from: cards).first,
12 let index = cards.firstIndex(where: { $0.id == card.id }) {
13 VStack(spacing: 24) {
14 Text(card.front).font(.title)
15 if showsAnswer {
16 Text(card.back).font(.title2).bold()
17 HStack {
18 ForEach(Rating.allCases, id: \.self) { rating in
19 Button(String(describing: rating).capitalized) {
20 if let outcome = try? scheduler.review(card.review, rating: rating) {
21 cards[index].review = outcome.state
22 }
23 showsAnswer = false
24 }
25 .buttonStyle(.bordered)
26 }
27 }
28 } else {
29 Button("Show Answer") { showsAnswer = true }
30 .buttonStyle(.borderedProminent)
31 }
32 }
33 .padding()
34 } else {
35 Text("All done for now")
36 }
37 }
38}

Installation

Xcode (File › Add Package Dependencies…)

text
1https://github.com/muhittincamdali/educationai.git

Swift Package Manager (Package.swift)

swift
1dependencies: [
2 .package(url: "https://github.com/muhittincamdali/educationai.git", from: "2.0.0")
3],
4targets: [
5 .target(name: "YourApp", dependencies: [
6 .product(name: "EducationAI", package: "educationai")
7 ])
8]

Screenshots

Der Wiederholungsbildschirm der Beispiel-App: die Karte Capital of Vietnam mit der Antwort Hanoi, Gedächtnis bei 90 % und vier Bewertungs-Buttons mit den Beschriftungen 10m Again, 1mo Hard, 2mo Good und 3mo Easy
Eine Quizfrage mit getippter Antwort, Capital of Morocco, beantwortet mit Raba: Das Feedback lautet Almost, es schreibt sich Rabat mit einem Tippfehler, und die Karte wird als Hard eingeplant
Der Fortschrittsbildschirm: eine 21-Tage-Serie, beste Serie 21, Retention 91 %, 84 Wiederholungen und ein Balkendiagramm der an jedem der nächsten 14 Tage fälligen Karten
Die Stapelliste: jede Hauptstadt mit ihrem Land, wann sie fällig ist und wie gut sie aktuell erinnert wird, etwa Hanoi jetzt fällig bei 90 %

Zeitleiste

  1. Repository eröffnet; 1.0.0 am 7. August getaggt: eine EducationAI-Klasse mit Lernmodellen, abhängig von Alamofire, RxSwift, SnapKit und SDWebImage

  2. Ohne Abhängigkeiten neu geschrieben als SM-2-Scheduler sowie Quiz-, Fortschritts-, Empfehlungs- und Gamification-Engines

  3. Eine Abhängigkeit auf einen lokalen Ordner (../SwiftAI) und Platzhaltertypen für „neural tutor“ und „enterprise“ wurden hinzugefügt; das Package ließ sich für niemand anderen mehr auflösen

  4. 2.0.0: neu aufgebaut um einen FSRS-6-Scheduler, der py-fsrs 6.3.2 entspricht; der Code vom Juni und jeder 1.x-Typ entfernt

Links

Verwandter Artikel

Artikel lesen (English)