2017-10-01 4 views
0

有効なJSONオブジェクトをきれいに印刷しようとすると、私は邪魔にならないというエラーに陥りました。この問題は辞書に情報を追加しようとしたときに始まり、辞書の拡張機能がこのタスクに必要でした。辞書にデータを追加するとスウィフトスクリプトでエラーが発生する

コードの目的は、のLinuxにアルバートランチャーの拡張テンプレートを作成することです。

エラーは次のとおりです。

./org.albert.extension.external.snippy.swift:10:21: warning: no calls to throwing functions occur within 'try' expression 
    let jsonS = try String(data: jsonD, encoding: String.Encoding.utf8) 
       ^
fatal error: Error raised at top level: The operation could not be completed: file /home/buildnode/jenkins/workspace/oss-swift-4.0-package-linux-ubuntu-16_10/swift/stdlib/public/core/ErrorType.swift, line 187 
Current stack trace: 
0 libswiftCore.so     0x00007f089c352bc0 _swift_stdlib_reportFatalErrorInFile + 221 

、コードは次のとおりです。ALBERT_OP="QUERY" ./script.swift

#! /usr/bin/swift 
import Glibc 
import Foundation 

let albert_op = ProcessInfo.processInfo.environment["ALBERT_OP"] 

extension Dictionary where Key == String { 
    func toPrettyJSON() throws -> String? { 
     let jsonD = try JSONSerialization.data(withJSONObject: self,options: [.prettyPrinted]) 
     let jsonS = try String(data: jsonD, encoding: String.Encoding.utf8) 
     return jsonS 
    } 
} 

if albert_op == "METADATA" { 
    let metadata : [String: Any] = [ 
     "iid": "org.albert.extension.external/v2.0", 
     "name": "snippets", 
     "version": "0.1", 
     "author": "lf-araujo", 
     "dependencies": [], 
     "trigger": "snip " 
    ] 

    let jsonData = try JSONSerialization.data(withJSONObject: metadata) 
    let JSONString = String(data: jsonData, encoding: String.Encoding.utf8)! 
    print(JSONString) 

} else if albert_op == "QUERY" { 
    let filemgr = FileManager.default 
    let filelist = try filemgr.contentsOfDirectory(atPath: "~/.snippy") 

    func buildItem(name: String) -> [String:Any] { 
    let action : [String: Any] = [ 
     "name": name 
    ] 
    return action 
    } 

    var items : [String: Any] = [:] 
    items["items"] = filelist.map { buildItem(name: $0) } 

    if let jsonStr = try? items.toPrettyJSON() { 
     print(jsonStr!) 
    } 

} 

exit(0) 

問題を再現するためには、でコードを実行する必要があります。

  • この特定のケースで何が間違っていますか?それは私がスクリプトとして実行しているという事実に関連していますか?
  • +0

    'String(data:jsonD、encoding:String.Encoding.utf8)'はエラーをスローしません。 'try'ブロックを削除することができます –

    +0

    ありがとうございます。それは本当ですが、主な問題はそのままです。 –

    答えて

    0

    あなたの問題はtry filemgr.contentsOfDirectory(atPath: "~/.snippy")です。具体的には、Swiftはパスのチルダを自動的に展開しません。 ("~/.snippy" as NSString).expandingTildeInPath

    +0

    ありがとうございました!私はそんなに長い間問題を見つけようとしています... –

    関連する問題