2015-01-06 2 views
4

스위프트를 사용하여 기본 계산기를 만들려고하지만 숫자를 눌렀을 때 상단에 숫자를 추가하는 방법을 알 수 없습니다. 단추를 밀 때마다 문자열에 숫자를 추가하려고하지만 "애매한 사용"오류가 나타납니다. 이 오류의 원인이되는 코드에 어떤 문제가 있으며 어떻게 기능 할 수 있도록 수정 될 수 있습니까?append를 모호하게 사용합니까?

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var oneButton: UIButton! 
    @IBOutlet weak var textField: UILabel! 




    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    @IBAction func onePressed(sender: AnyObject) { 

     textField.text?.append("1") 

    } 

} 

답변

11

주입니다 appendextend가 다른 모음의 내용을 추가, 컬렉션의 끝에 하나의 요소를 추가합니다. 문자열의 경우 append은 단일 문자를 추가하는 반면 extend은 다른 문자열 (또는 다른 모음 또는 배열 같은 문자 시퀀스)을 추가합니다.

추가의 경우 String에는 추가 기능이 두 가지 있습니다. 하나는 Character이고 하나는 UnicodeScalar입니다. 둘 다 추가라고 부릅니다.

당신은 문자열 변수에 완성 팝업을 얻을 경우, 당신은 그들을 볼 수 있습니다 :

image of completion options for String.append

당신은 당신이 원하는 어느 스위프트 말할 필요 :

textField.text?.append(“1” as Character) 

또는

textField.text?.append(“1” as UnicodeScalar) 

이 모호성은 l의 여러 오버로드로 인해 발생합니다. 한 문자가 "" 사이에있는 경우 이탤릭 변환. "a"을 작성하면 String, Character, UnicodeScalar 또는 StringLiteralConvertible 구현 (예 : URL을 나타내는 유형)이있는 사용자 정의 유형 중 하나가 생성 될 수 있습니다. String은 배제됩니다 (append은 하나를 차지하지 않습니다).하지만 나머지 두 개는 여전히 남습니다.

let c: Character = "a" 
textField.text?.append(c) // no ambiguity 

스위프트 컨텍스트 (즉, 어떤 잠재적 인 일치하는 함수 호출의 인수의 유형은 수도에서 결정 : 동음이 필요 없을 것이다

반면에 이미 Character 변수를 가지고 있다면, 있다). 다른 솔루션은 + 연결 연산자 또는 .extend()을 제안합니다. +=도 사용할 수 있습니다. 이들은 과부하가 없기 때문에 모호하지 않습니다. String (또는 extend의 경우 다른 문자 집합 인 String)을 취하므로 Swift는 리터럴에서 String으로 변환하지 않습니다 도움.

+0

팁 주셔서 감사합니다! Swift에서 "as"구문을 인식하지 못했습니다. –

3

문자열을 연결하는 데 +을 사용할 수 있습니다. 같은

사용 : 규칙은 스위프트의 컬렉션을 다루는 것을

@IBAction func onePressed(sender: AnyObject) 
{ 
    if let txt = textField?.text 
    { 
     textField?.text = txt + "1" 
    } 
} 
+0

상단에 모든 버튼 콘센트가있는 ** let txt = textField.text **를 정의 할 수없는 이유는 무엇입니까? 그렇게 할 수 있다는 것이 훨씬 더 효율적입니다. –

+0

@ Physics137 : 당신이 묻는 것을 이해하지 못했습니다. 조금 설명 할 수 있습니까? –

+0

** let txt = textField.text **를 함수 상단이 아닌 코드 상단에 놓을 수 있다면 ** textField? .text = txt + "number"**를 사용하지 않고도 ** text.text = ** text.text **를 반복 입력하십시오. –

2

extend을 의미 할 때 append을 사용하고있는 것이 문제입니다.이 쓰기, 그리고 모든 것이 잘 될 것입니다 :

textField.text?.extend("1") 
+1

누가 '연장하다'고 말합니까? 의도는 문자를 추가하는 것일 수 있습니다. 확장이 명확하지 않다는 것이 문제를 숨기는 올바른 해결책이라는 것을 의미하지는 않습니다 ... –

+1

@AirspeedVelocity 여러분의 작업을 존중하는 것처럼, 여러분이 말하는 것을 말하면서이 말을해야합니다. 내가 말하다. – matt

0

허용 대답은 기술적으로 정확하고 매우 좋은 일이지만 문자열

문자열을 덧붙이, 그것은 보인다이다 (내 가정) 모든 OP 문자열에 문자열을 추가하고 문자열에 UnicodeScalar 또는 Character 리터럴을 추가하지 않는 것입니다.

대부분의 사용자가 비슷한 것을하고 싶다고 가정 할 경우 .appendContentsOf(other: String)을 사용하십시오.

textfield.text?.appendContentsOf("1") 

또한 더 이상 사용되지 않는 .extend()은 더 이상 제공되지 않습니다.

관련 문제