2014-07-12 2 views
3

저는 오랫동안 Obj-C 개발자 였지만 다른 모든 사람들처럼 Swift에 익숙하지 않았으며 저의 머리에서 긁어 모았습니다. Obj-C로 작성된 이전 튜토리얼을 변환하려고합니다."유형 문자열이 프로토콜 StringLiteralConvertible을 준수하지 않습니다."

나는 "동물"클래스는과 같이 선언 :

:
class Animal 
{ 
    let title: String 
    let image: UIImage 
    let creator: String 

    init(title: String, image: UIImage, creator: String) 
    { 
     self.title = title 
     self.image = image 
     self.creator = creator 
    } 
} 

그리고 다른 클래스에서

, 내가 지금 같은 클래스의 속성으로 선언 동물 인스턴스의 배열을 원하는
let animals: [Animal] 

그리고 (실패) 초기화과 같이 :

animals = [Animal(title: "Sleeping Cat", image: UIImage.imageNamed("ID-101.jpg") 
creator:"papaija2008"), 
... 
... 
] 

나는 t에서 빌드 오류를 얻고있다 그는 게시물의 제목처럼 읽는이 배열 초기화 프로그램의 첫 번째 줄 : "유형 문자열이 프로토콜 StringLiteralConvertible을 준수하지 않습니다". String 객체에 문자열 리터럴을 할당 할 수 있습니까? 그건 불가능 해 보입니다. 어떤 규칙이 위반되며 어떻게 해결합니까? 사전에

감사합니다!

+2

이 오류는 많이 발생했으며 일반적으로 특정 문자열 관련 오류가 잘못되었음을 의미하지는 않습니다. 함수에 전달하는 매개 변수가 어떤 식 으로든 부적절한 경우가 종종 있습니다. 나는 각각의 관련 매개 변수에 대해 명시적인 유형으로'let'을 사용하고 그런 변수를 전달함으로써 이와 같은 문제를 해결했습니다. 컴파일러는 일반적으로 더 유용한 오류 메시지를 제공합니다. – Bill

답변

3

나를 위해 UIImage(named:) 대신 UIImage.imageNamed()의 작품을 사용 :

let animals: [Animal] = [Animal(title: "Sleeping Cat", image: UIImage(named: "ID-101.jpg"), creator:"papaija2008")] 

내가 너무 당신을 위해 작동 바랍니다.

+0

감사합니다. UIImage.imageNamed()가 이전 Obj-C 메서드를 호출하고 NSString 인수를 취하므로 String이 암시 적으로 NSString으로 변환 될 수없는 것처럼 보입니다. 물론 변환하기보다는 Swift API를 사용하는 것이 더 합리적입니다. 어쨌든 감사합니다! –

+1

사실 놀이터에서 보이는 오류는'imageNamed is unavailable : object construct UIImage (named :)'를 사용합니다. 중요한 것은 그것이 당신의 문제를 해결했다는 것입니다. – Antonio

+5

@ReidBelton 아니요, 'String'과 'NSString'은 완벽하게 연결되어 있습니다. 즉, 'String'이 예상되는 곳에 NSString을 전달할 수 있으며 반대의 경우도 마찬가지입니다. 문제는 Swift가 구식 Objective-C 이니셜 라이저를 수정하여 새로운 생성자 구문을 사용한다는 것입니다. 그래서 Objective-C의'NSThingy.thingyWithName'은 Swift의 생성자가되어'NSThingy (name : ...)'를 호출합니다. 'UIImage' 문서를 보면 Swift와 Objective-C 호출이 주어진 메소드에서 어떻게 다른지 알 수 있습니다. – Bill

관련 문제