2016-11-23 1 views
0

SQLite DB에서받은 날짜를 Var로 Date에 저장하는 데 문제가 있습니다. DB에서 오는 날짜를 ResultTask.AlarmDate으로 저장하려고합니다. 그것을 String에서 Date로 변환합니다. 나는 시도하고 데이터의 벌금을 저장,하지만 난 알람없이 작업을 할 때 나는 아무 경보도 없다가 VAR 때 nil을 저장할 원인 내가 오류가 ResultTask.AlarmDate?에서 ? 삭제 및 기타 여러 시도변수가 주어진 항목을 저장하지 않습니다. - Swift 3

그것을 고치는 방법 그러나 아무것도 작동하지 않는다.

나는 모든 나는 내가 VAR에 저장하기 위해 노력하고있어 인쇄하지만, VAR는 여전히 nil 때 표시되는 데이터의 원인, 문제 후 브레이크 포인트를 오른쪽으로 만들어 데이터를 볼 수 Console을 사용하고 혼동있어 아래에 나와 있습니다.

노트

DB에서 데이터를 가져 오는 것은, 내가 목표 - C FM-데이터베이스 라이브러리를 사용하고 잘 작동하고, 결과는 아래의 Console에서 볼 수 있다는 코드입니다. .toDate()

내가 사용 String에 대한 확장이며 울부 짖는 소리와 같이이 코드는 AppDelegate.swift이며, 그것을 잘 작동합니다.

Task 변수 유형은 내가 쉽게 작업에 Task.swift 파일에 만든 무언가이며, & 아래와 같이 잘 작동합니다.

기능 :

func GetTasks() -> [Task]{ 
     var Tasks : [Task] = [Task]() 

     let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask, true) 
     let docsDir = dirPaths[0] 
     databasePath = (docsDir + "/" + "Tasks.db") as NSString 

     let TaskRecorderDB = FMDatabase(path: databasePath as String) 
     if (TaskRecorderDB?.open())! { 
      let querySQL = "Select * from 'Tasks' ORDER BY Priority DESC" 
      let results:FMResultSet? = TaskRecorderDB?.executeQuery(querySQL, withArgumentsIn: nil) 

      while results!.next() { 
       var ResultTask : Task! = Task() 
       ResultTask.ID = Int((results?.int(forColumn: "ID"))!) 
       ResultTask.FileName = results?.string(forColumn: "FileName") 
       ResultTask.Name = results?.string(forColumn: "Name") 
       ResultTask.Categorie = Int((results?.int(forColumn: "Categorie"))!) 
       ResultTask.Priority = Int((results?.int(forColumn: "Priority"))!) 
       ResultTask.AlarmDate? = (results?.string(forColumn: "Alarm").toDate())! 
       //Break point 
       ResultTask.Repeat? = (results?.string(forColumn: "Repeat"))! 
       ResultTask.Completed = Int((results?.int(forColumn: "Completed"))!).toBool() 

       if(ResultTask.Completed == false){ 
        Tasks.append(ResultTask) 
       } 
       ResultTask = nil 
      } 

      TaskRecorderDB?.close() 
     } else { 
      print("Error #DB06: \(TaskRecorderDB?.lastErrorMessage())") 
     } 

     return Tasks 
    } 

콘솔 :

(lldb) print (results?.string(forColumn: "Alarm").toDate())! 
(Date) $R0 = 2016-11-23 17:21:00 UTC 
(lldb) print ResultTask.AlarmDate 
(Date?) $R1 = nil 
(lldb) 

AppDelegate.swift :

extension String { 
    func toDate() ->Date! { 
     var FinalDate : Date! = nil 
     if (self != ""){ 
      let DateFormatter : Foundation.DateFormatter = Foundation.DateFormatter() 
      DateFormatter.locale = Locale.current 
      DateFormatter.dateFormat = "y-MM-dd_HH-mm-ss" 
      FinalDate = DateFormatter.date(from: self)! 
     } 

     return FinalDate 
    } 
} 

Task.swift : 사전에

import Foundation 

class Task : NSObject { 
    var ID : Int! = nil 
    var FileName : String! = nil 
    var Name : String! = nil 
    var Categorie : Int! = nil 
    var Priority : Int! = nil 
    var AlarmDate : Date! = nil 
    var Repeat : String! = nil 
    var Expired : Bool! = nil 
    var Completed : Bool! = nil 
} 

감사합니다. @KaraBenNemsi에 대한

편집 : 당신이 말한대로

나는 .toDate()를 업데이트합니다.

&

는 작업에서 나는 var AlarmDate : Date? 대신 var AlarmDate : Date! = nil (필자는 응용 프로그램에서 다른 코드를 많이 변경해야합니다 원인 난 당신이 지금 Task.swift 다른 팁을있어 사용하지 않은) 사용.

그리고 ResultTask.AlarmDate = results?.string(forColumn: "Alarm").toDate()을 사용하고 작업에 알람이없는 경우 fatal error: unexpectedly found nil while unwrapping an Optional value이 표시됩니다.이

에서이

var AlarmDate: Date! = nil 

var AlarmDate: Date? 

에 선택 사양 일 그리고 알람을 설정하려면이 줄을 사용 할 수 있기 때문에

+1

(부분적으로 모순되는) 질문 및 느낌표의 엉망을 정리하는 것이 좋습니다. 속성이 값을 가지고 있다고 가정하면 속성을 비표준으로 처리하고 그렇지 않으면 실제 옵션으로 처리합니다. 암시 적 언 래핑 옵션으로 선언 된 속성은 최악의 방법입니다. – vadian

+0

@vadian 나는 그것에 익숙하지 않다. 나는 그것을 싫어하고 두통을 느낀다. 하지만 그걸로 많이 연주하고 그것으로 많은 상황을 만들었지 만 대부분 오류가있어서 앱을 실행할 수 없거나 작동하지만 원하는만큼 좋아지지 않았습니다. –

+0

그래서 나는이 줄'ResultTask.AlarmDate = results? .string (forColumn : "Alarm"). toDate()'에서 여전히 충돌한다는 것을 이해한다. 'string (forColumn : String)'함수의 코드를 올리시겠습니까? – KaraBenNemsi

답변

1

봅니다 작업 클래스에서이 줄을 변경

ResultTask.AlarmDate = results?.string(forColumn: "Alarm")?.toDate() 

또한 변수 이름은 대개 소문자로 시작해야합니다.

이 줄이 필요 없다고 생각합니다. 그 줄을 그냥 생략 할 수 있습니다.

ResultTask = nil 

또한 선택적 항목이 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

추가를 작동하는 방법에 더 얻으려고 어쩌면

extension String { 
func toDate() -> Date? { 
    guard self != "" else { 
     return nil 
    } 
    var finalDate: Date? 
    let DateFormatter : Foundation.DateFormatter = Foundation.DateFormatter() 
    DateFormatter.locale = Locale.current 
    DateFormatter.dateFormat = "y-MM-dd_HH-mm-ss" 
    finalDate = DateFormatter.date(from: self) 
    return finalDate 
    } 
} 

에 확장자를 변경하십시오 클래스 작업은 아마도 더 아래처럼 보일 것입니다. 그러나 다른 곳에서도 코드를 변경해야합니다. 또한 작업 객체를 초기화 할 때 생성자에서 필요한 모든 매개 변수를 전달해야합니다.

https://github.com/raywenderlich/swift-style-guide

+0

알람이 발생하면 작동하지만, 알람이 없으면 '치명적인 오류가 발생합니다 : 선택 값을 언 래핑하는 동안 예기치 않게 nil을 발견했습니다.'오류가 발생합니다. –

+0

알람이 없을 때 var가 0이되기를 원합니다 –

+0

/어디에서 오류가 발생합니까? – KaraBenNemsi

0

var AlarmDate : Date? 

을 가지고 당신의 작업을 변경 한 다음이

if let alarm = results?.string(forColumn: "Alarm").toDate() { 
    ResultTask.AlarmDate = alarm 
} 

:

class Task { 
    var id: Int 
    var fileName: String 
    var name: String 
    var category: Int 
    var priority: Int 
    var alarmDate: Date? 
    var repeating: String 
    var expired: Bool 
    var completed: Bool 

    init(id: Int, fileName: String, name: String, category: Int, priority: Int, repeating: String, expired: Bool, completed: Bool) { 
     self.id = id 
     self.fileName = fileName 
     self.name = name 
     self.category = category 
     self.priority = priority 
     self.repeating = repeating 
     self.expired = expired 
     self.completed = completed 
    } 
} 

그리고 여기에 또한 스위프트 스타일 가이드에 대한 링크입니다

결과를 언 래핑하는 동안 nil이 발견되면 ResultTask.AlarmDate의 값을 설정하지 않습니다.

+0

이미 게시 됨 – KaraBenNemsi

+0

죄송합니다 @KaraBenNemsi, 나는 방금 if-let으로 조금 도울 수 있다고 생각했습니다. toDate() 함수 (내가 응답 할 때까지 존재하지 않았던)에 대한 업데이트로, 모든 것이 작동 할 것입니다. –

+0

문제 없음 ;-) @JeanSandrin 나쁜 타이밍. 그러나 질문자는 선택 사항을 어쨌든 쓸어 가야합니다. – KaraBenNemsi

관련 문제