2014-10-08 22 views
6

Tôi đang cố gắng xây dựng hệ thống tự động sửa lỗi, vì vậy tôi cần có thể xóa từ cuối cùng được nhập và thay thế bằng từ đúng. Giải pháp của tôi:Xóa từ cuối cùng khỏi chuỗi trong Swift

func autocorrect() { 
    hasWordReadyToCorrect = false 
    var wordProxy = self.textDocumentProxy as UITextDocumentProxy 
    var stringOfWords = wordProxy.documentContextBeforeInput 

    fullString = "Unset Value" 

    if stringOfWords != nil { 
     var words = stringOfWords.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 
     for word in words { 
      arrayOfWords += [word] 
     } 
     println("The last word of the array is \(arrayOfWords.last)") 
     for (mistake, word) in autocorrectList { 
      println("The mistake is \(mistake)") 
      if mistake == arrayOfWords.last { 
       fullString = word 
       hasWordReadyToCorrect = true 
      } 
     } 
     println("The corrected String is \(fullString)") 

    } 
} 

Phương pháp này được gọi sau mỗi lần nhấn phím và nếu không gian được nhấn, nó sẽ sửa từ đó. Vấn đề của tôi xuất hiện khi chuỗi văn bản dài hơn khoảng 20 từ. Phải mất một lúc để nó lấp đầy mảng mỗi khi một ký tự được nhấn, và nó bắt đầu tụt hậu đến một điểm không thể sử dụng nó. Có cách nào Swift hiệu quả và thanh lịch hơn để viết chức năng này không? Tôi đánh giá cao sự giúp đỡ nào!

Trả lời

5

1.

Một điều, lặp đi lặp lại là không cần thiết cho việc này:

for word in words { 
    arrayOfWords += [word] 
} 

Bạn chỉ có thể làm:

arrayOfWords += words 

2.

Phá vỡ vòng lặp for wil l ngăn chặn lặp không cần thiết:

for (mistake, word) in autocorrectList { 
    println("The mistake is \(mistake)") 
    if mistake == arrayOfWords.last { 
     fullString = word 
     hasWordReadyToCorrect = true 
     break; // Add this to stop iterating through 'autocorrectList' 
    } 
} 

Hoặc thậm chí tốt hơn, quên cho vòng lặp hoàn toàn:

if let word = autocorrectList[arrayOfWords.last] { 
    fullString = word 
    hasWordReadyToCorrect = true 
} 

Cuối cùng những gì bạn đang làm là nhìn thấy nếu từ cuối cùng của văn bản đã nhập phù hợp với bất kỳ trong danh sách tự động sửa. Bạn chỉ có thể cố gắng để có được giá trị trực tiếp bằng cách sử dụng tùy chọn ràng buộc như thế này.

---

tôi sẽ cho bạn biết nếu tôi nghĩ về nhiều hơn nữa.

+0

Đặng ! Bạn đã đơn giản hóa tất cả mã của tôi thành 3 dòng và nó hoạt động tốt hơn nhiều! Tôi sẽ giữ cho trang mở trong trường hợp bạn nghĩ nhiều hơn, nhưng đến bây giờ tôi không có vấn đề với độ trễ trong một đoạn lớn mà tôi đã gõ. Điều duy nhất tôi lo lắng là, từ điển của tôi mà nó kiểm tra chỉ dài khoảng 10 từ vì nó là một bài kiểm tra trước khi tôi lập danh sách đầy đủ. Bạn có nghĩ mã này sẽ vẫn hiệu quả không khi danh sách các từ được lâu hơn nhiều? – SomeGuy

+1

@SomeGuy - Từ điển được thiết kế để được tối ưu hóa, do đó, tra cứu không nên hạn chế hiệu suất quá nhiều. Với điều đó đang được nói, có một từ điển rất lớn và xử lý với mỗi đột quỵ quan trọng có thể hiển thị một số hit hiệu suất. Tôi không thể tìm thấy bất kỳ điểm chuẩn nhanh chóng nào từ việc tìm kiếm xung quanh nên tôi thực sự không thể nói chắc chắn. – Logan

+0

Có cách nào hiệu quả hơn bạn có thể nghĩ đến để tạo hệ thống tự động sửa không? Tôi vừa mới tạo cặp giá trị quan trọng cho những thứ như người nhận là chìa khóa và có giá trị, vì vậy nếu người dùng nhập theee, nó sẽ thay đổi ở đó. – SomeGuy

9

này không trả lời "tự động sửa lỗi" vấn đề của OP trực tiếp, nhưng điều này là mã có lẽ là cách dễ nhất để trả lời câu hỏi đặt ra trong tiêu đề:

Swift 3

let myString = "The dog jumped over a fence" 
let myStringWithoutLastWord = myString.components(separatedBy: " ").dropLast().joined(separator: " ") 
Các vấn đề liên quan