2016-02-13 55 views
6

Wiem, że do programowania w STDIN i STDOUT, musimy wykonać projekt wiersza poleceń w Xcode. Ale jak wziąć standardowe wejście na plac zabaw.Jak wziąć STDIN na plac zabaw Swift

Ilekroć próbuję uruchomić taki kod na placu zabaw

var input = readLine()! 

zawsze uzyskać ten błąd

Wykonanie została przerwana, powód: EXC_BAD_INSTRUCTION (Code = EXC_l386_INVOP, subkod = 0x0)

Czy można zabrać STDIN na plac zabaw, czy nie?

UPDATE

wiem, że to jest błąd z powodu nilinput zmienna, ale chce wiedzieć, jak rozwiązać ten zerowa wartość.

+0

Możliwy duplikat [Swift Dodawanie: Zawarcie został przerwany, rozum : EXC \ _BAD \ _INSTRUCTION (Code = EXC \ _l386 \ _INVOP, subcode = 0x0)] (http: // stackoverflow.com/questions/35347755/swift-add-execution-was-interrupted-reason-exc-bad-instruction-code-exca) –

+0

nie, nie - spodziewam się, jak wziąć STDIN na place zabaw, to pytanie jest trochę inne . @HenrikGustafsson –

Odpowiedz

1

Aby uzyskać dane wejściowe z wiersza polecenia, np. Console.ReadLine ... Chalkery mają następujące rozwiązanie.

func input() -> String { 
    var keyboard = NSFileHandle.fileHandleWithStandardInput() 
    var inputData = keyboard.availableData 
    return NSString(data: inputData, encoding:NSUTF8StringEncoding) as! String 
} 

proszę pytać o dalsze, jeśli to nie działa Vinod.

+0

nie ta funkcja input() jest taka sama jak readLine(). Obawiam się, jak uzyskać standardowe wejście od użytkownika na placu zabaw. –

2

Spróbuj użyć Optional Chaining:

if let input = readLine() { 
    print("Input: \(input)") 
} else { 
    print("No input.") 
} 
+0

Oczywiście na ekranie pojawi się komunikat "Brak danych. \ N" na placu zabaw. Ale nie może być odpowiedzią na moje pytanie. Tak, to była fajna sztuczka. –

+0

O ile wiem, nie można użyć standardowego wejścia z placu zabaw. To tylko sposób na obejście problemu zero. Powinien działać, gdy uruchomisz go poza placem zabaw. –

+0

czy możesz mi powiedzieć, dlaczego ten kod działa 'var input = readLine()' i dlaczego nie to 'var input = readLine()!' Na placu zabaw. –

3

Stałe rozwiązanie dla SWIFT 3

Aby to działało, należy utworzyć nowy projekt narzędzie wiersza poleceń.

Przejdź do "Plik" -> "Nowy" -> "Projekt" -> "macOS" -> "Narzędzie wiersza poleceń".

import Foundation 

print("Hello, World!") 


func solveMefirst(firstNo: Int , secondNo: Int) -> Int { 
    return firstNo + secondNo 
} 

func input() -> String { 
    let keyboard = FileHandle.standardInput 
    let inputData = keyboard.availableData 
    return NSString(data: inputData, encoding:String.Encoding.utf8.rawValue) as! String 
} 

let num1 = readLine() 
let num2 = readLine() 

var IntNum1 = Int(num1!) 
var IntNum2 = Int(num2!) 

print("Addition of numbers is : \(solveMefirst(firstNo: IntNum1!, secondNo: IntNum2!))") 

i uruchomić projekt korzystając CMD + R

-1

Przejdź do

Nowy> Projekt> MacOs> Command Line Narzędzie

następnie można zastosować:

let wartosc1: String?

value1 = readLine() 
print(value ?? "") 

„” dla wartości domyślnej

1

zabaw nie może odczytać dane wejściowe z wiersza pochwalić.

Można użyć niestandardowego „readline()” funkcja i zmienna wejściowa globalnym, każdy element tablicy wejściowej prezentuje linię:

import Foundation 

var currentLine = 0 
let input = ["5", "5 6 3"] 

func readLine() -> String? { 
    if currentLine < input.endIndex { 
     let line = input[currentLine] 
     currentLine += 1 
     return line 
    } else { 
     return nil 
    } 
} 

let firstLine = readLine() // 5 
let secondLine = readLine() // 5 6 3 
let thirdLine = readLine() // nil 
+0

Jest to świetne rozwiązanie do użytku na stronach takich jak HackerRank, gdy używasz Xcode Playground do pracy nad kodem. –