diff --git a/Source/Modules/LangModelRelated/LMInstantiator.swift b/Source/Modules/LangModelRelated/LMInstantiator.swift index 134aed54..96e6130d 100644 --- a/Source/Modules/LangModelRelated/LMInstantiator.swift +++ b/Source/Modules/LangModelRelated/LMInstantiator.swift @@ -31,8 +31,8 @@ import Foundation // 簡體中文模式與繁體中文模式共用全字庫擴展模組,故單獨處理。 // 塞在 LMInstantiator 內的話,每個模式都會讀入一份全字庫,會多佔用 100MB 記憶體。 -private let lmCNS = vChewing.LMLite(consolidate: false) -private let lmSymbols = vChewing.LMCore(reverse: true, consolidate: false, defaultScore: -13.0, forceDefaultScore: true) +private var lmCNS = vChewing.LMLite(consolidate: false) +private var lmSymbols = vChewing.LMCore(reverse: true, consolidate: false, defaultScore: -13.0, forceDefaultScore: true) extension vChewing { /// LMInstantiator is a facade for managing a set of models including @@ -69,22 +69,21 @@ extension vChewing { /// 至於像全字庫這樣所有記錄都使用同一權重數值的模組,可以用 LMLite 以節省記憶體佔用。 /// LMLite 的辭典內不會存儲權重資料,只會在每次讀取記錄時施加您給定的權重數值。 /// LMLite 與 LMCore 都會用到多執行緒、以加速載入(不然的話,全部資料載入會耗費八秒左右)。 - /// 然而,對於使用者語彙模型檔案而言,多執行緒可能會出現意料之外的問題,所以有了 LMLiteMono。 /// LMReplacements 與 LMAssociates 均為特種模組,分別擔當語彙置換表資料與使用者聯想詞的資料承載工作。 // 聲明原廠語言模組 /// Reverse 的話,第一欄是注音,第二欄是對應的漢字,第三欄是可能的權重。 /// 不 Reverse 的話,第一欄是漢字,第二欄是對應的注音,第三欄是可能的權重。 - let lmCore = LMCore(reverse: false, consolidate: false, defaultScore: -9.5, forceDefaultScore: false) - let lmMisc = LMCore(reverse: true, consolidate: false, defaultScore: -1, forceDefaultScore: false) + var lmCore = LMCore(reverse: false, consolidate: false, defaultScore: -9.5, forceDefaultScore: false) + var lmMisc = LMCore(reverse: true, consolidate: false, defaultScore: -1, forceDefaultScore: false) // 聲明使用者語言模組。 // 使用者語言模組使用多執行緒的話,可能會導致一些問題。有時間再仔細排查看看。 - let lmUserPhrases = LMLiteMono(consolidate: true) - let lmFiltered = LMLiteMono(consolidate: true) - let lmUserSymbols = LMLiteMono(consolidate: true) - let lmReplacements = LMReplacments() - let lmAssociates = LMAssociates() + var lmUserPhrases = LMLite(consolidate: true) + var lmFiltered = LMLite(consolidate: true) + var lmUserSymbols = LMLite(consolidate: true) + var lmReplacements = LMReplacments() + var lmAssociates = LMAssociates() // 初期化的函數先保留 override init() {} diff --git a/Source/Modules/LangModelRelated/SubLMs/lmAssociates.swift b/Source/Modules/LangModelRelated/SubLMs/lmAssociates.swift index 948c16f2..0fe67c9f 100644 --- a/Source/Modules/LangModelRelated/SubLMs/lmAssociates.swift +++ b/Source/Modules/LangModelRelated/SubLMs/lmAssociates.swift @@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import Foundation extension vChewing { - public class LMAssociates { + @frozen public struct LMAssociates { var keyValueMap: [String: [Megrez.KeyValuePair]] = [:] var theData: String = "" @@ -36,17 +36,11 @@ extension vChewing { theData = "" } - deinit { - if isLoaded() { - close() - } - } - public func isLoaded() -> Bool { !keyValueMap.isEmpty } - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult mutating public func open(_ path: String) -> Bool { if isLoaded() { return false } @@ -98,7 +92,7 @@ extension vChewing { return true } - public func close() { + mutating public func close() { if isLoaded() { keyValueMap.removeAll() } diff --git a/Source/Modules/LangModelRelated/SubLMs/lmCore.swift b/Source/Modules/LangModelRelated/SubLMs/lmCore.swift index ec666661..8ab55d5c 100644 --- a/Source/Modules/LangModelRelated/SubLMs/lmCore.swift +++ b/Source/Modules/LangModelRelated/SubLMs/lmCore.swift @@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import Foundation extension vChewing { - public class LMCore { + @frozen public struct LMCore { var keyValueScoreMap: [String: [Megrez.Unigram]] = [:] var theData: String = "" var shouldReverse: Bool = false @@ -47,17 +47,11 @@ extension vChewing { shouldForceDefaultScore = forceDefaultScore } - deinit { - if isLoaded() { - close() - } - } - public func isLoaded() -> Bool { !keyValueScoreMap.isEmpty } - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult mutating public func open(_ path: String) -> Bool { if isLoaded() { return false } @@ -132,7 +126,7 @@ extension vChewing { return true } - public func close() { + mutating public func close() { if isLoaded() { keyValueScoreMap.removeAll() } @@ -152,17 +146,17 @@ extension vChewing { IME.prtDebugIntel(strDump) } - open func bigramsForKeys(precedingKey: String, key: String) -> [Megrez.Bigram] { + public func bigramsForKeys(precedingKey: String, key: String) -> [Megrez.Bigram] { // 這裡用了點廢話處理,不然函數構建體會被 Swift 格式整理工具給毀掉。 // 其實只要一句「[Megrez.Bigram]()」就夠了。 precedingKey == key ? [Megrez.Bigram]() : [Megrez.Bigram]() } - open func unigramsFor(key: String) -> [Megrez.Unigram] { + public func unigramsFor(key: String) -> [Megrez.Unigram] { keyValueScoreMap[key] ?? [Megrez.Unigram]() } - open func hasUnigramsFor(key: String) -> Bool { + public func hasUnigramsFor(key: String) -> Bool { keyValueScoreMap[key] != nil } } diff --git a/Source/Modules/LangModelRelated/SubLMs/lmLite.swift b/Source/Modules/LangModelRelated/SubLMs/lmLite.swift index a843474d..23156d93 100644 --- a/Source/Modules/LangModelRelated/SubLMs/lmLite.swift +++ b/Source/Modules/LangModelRelated/SubLMs/lmLite.swift @@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import Foundation extension vChewing { - public class LMLite { + @frozen public struct LMLite { var keyValueMap: [String: [Megrez.KeyValuePair]] = [:] var theData: String = "" var allowConsolidation = false @@ -38,17 +38,11 @@ extension vChewing { allowConsolidation = consolidate } - deinit { - if isLoaded() { - close() - } - } - public func isLoaded() -> Bool { !keyValueMap.isEmpty } - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult mutating public func open(_ path: String) -> Bool { if isLoaded() { return false } @@ -105,7 +99,7 @@ extension vChewing { return true } - public func close() { + mutating public func close() { if isLoaded() { keyValueMap.removeAll() } diff --git a/Source/Modules/LangModelRelated/SubLMs/lmReplacements.swift b/Source/Modules/LangModelRelated/SubLMs/lmReplacements.swift index b8e9b6ba..30337af6 100644 --- a/Source/Modules/LangModelRelated/SubLMs/lmReplacements.swift +++ b/Source/Modules/LangModelRelated/SubLMs/lmReplacements.swift @@ -27,7 +27,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import Foundation extension vChewing { - public class LMReplacments { + @frozen public struct LMReplacments { var keyValueMap: [String: String] = [:] var theData: String = "" @@ -36,17 +36,11 @@ extension vChewing { theData = "" } - deinit { - if isLoaded() { - close() - } - } - public func isLoaded() -> Bool { !keyValueMap.isEmpty } - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult mutating public func open(_ path: String) -> Bool { if isLoaded() { return false } @@ -98,7 +92,7 @@ extension vChewing { return true } - public func close() { + mutating public func close() { if isLoaded() { keyValueMap.removeAll() }