2014-06-07 5 views
32

Swift에서 변수 유형을 결정하는 함수가 있습니까? 나는 파이썬에서 type()과 같은 것이있을 것이라고 추정한다.Swift에서 변수 유형을 결정하는 방법

변수가 Swift의 Foundation 개체 또는 C 변수인지 판단하는 방법이 필요합니다. NSString 대 NSString 대 배열. 그래서 콘솔에서 로그 아웃하고 그것이 무엇인지 명확하게 볼 수 있습니다. 나는 주어진 변수가 유형에 주어진 의 한 종류 인 경우 판단에 대한 답변을 보았다

var array = [1,2,3] // by default NSArray or array? 
var array:[Int] = [1,2,3] 
var array:NSArray = [1,2,3] 
var array:Array<Any> = [1,2,3] 

:

예를 들어, 나는 아래의 첫 번째 array에 대한 추론 유형을 알고 싶습니다 this question,하지만 내가 묻고 싶은 것과는 아주 다르다고 말할 것입니다.

+0

을하지 얻을 수 있지만, 당신은 자신을 구를 수 : 이제 단순히 (: ___의) 유형을 사용할 수 있습니까? –

+0

내 문장을 더 명확하게 만들기 위해 편집 한 질문이 있습니다 – piaChai

+0

이 지식을 사용하고자하는 코드 유형의 예를 들려 주시겠습니까? 타입이 컴파일 타임에 알려지면'func show (x : T) {println ("\ (x)는 \ (T) 타입이다}}'와 같은 일반적인 함수를 사용할 수있다. 컴파일 타임에 알려지지 않았기 때문에, C 값이 필요한 런타임 메타 데이터를 가지고있는 것처럼 보이지 않기 때문에 이것이 가능할 지 확실하지 않습니다. (슬프게도 나는 애플이 여전히 –

답변

23

.dynamicType 속성을 사용하여 값의 유형 객체에 대한 참조를 가져올 수 있습니다. 이것은 파이썬의 type() 함수와 동일하며, in the Swift documentation under Language Reference: Types: Metatype Type으로 언급됩니다.

var intArray = [1, 2, 3] 
let typeOfArray = intArray.dynamicType 

이 유형의 개체를 사용하여 동일한 배열 유형의 새 인스턴스를 만들 수 있습니다.

var newArray = typeOfArray() 
newArray.append(5) 
newArray.append(6) 
println(newArray) 
[5, 6] 
우리는이 새로운 값이 부동 추가 시도하여 동일한 유형 ( [Int])의 것을 볼 수 있습니다

: 우리는 코코아를 가져 오는 경우

newArray.append(1.5) 
error: type 'Int' does not conform to protocol 'FloatLiteralConvertible' 

및 배열을 사용 리터럴 유형이 혼합 된 경우 NSArray이 생성되었음을 알 수 있습니다.

import Cocoa 

var mixedArray = [1, "2"] 
let mixedArrayType = mixedArray.dynamicType 

var newArray = mixedArrayType() 
var mutableArray = newArray.mutableCopy() as NSMutableArray 

mutableArray.addObject(1) 
mutableArray.addObject(1.5) 
mutableArray.addObject("2") 

println(mutableArray) 
(1, "1.5", 2) 

그러나이 시점에서 유형 객체의 문자열 설명을 생성하는 일반적인 방법은없는 것처럼 보이므로 여기서는 사용자가 묻는 디버깅 역할을 수행하지 못할 수 있습니다. in SiLo's answer를 사용되는 NSObject에서 파생

유형

__NSArrayI 

println(mixedArrayType.description()) 

그러나이 같은 스위프트에 내장 된 배열과 같은 유형에없는,하는 .description() 방법이 있습니까.

println(typeOfArray.description()) 
error: '[Int].Type' does not have a member named 'description' 
+0

BTW :'obj.description()'을 사용하면 항상'String (obj)'를 사용할 수 있습니다 (사용 가능한 경우 설명이 사용됩니다). – Tali

+2

.dynamicType은 현재 사용되지 않습니다. 이에 상응하는 typeof equivalent는 현재 타입입니다 (of : myvariable) – logicor

+0

@logicor 정보를 제공해 주셔서 감사합니다. 이 게시물에 대한 수정을 제안하고 싶습니다 (추가로 크레딧을받을 수 있습니다)? 그렇지 않다면 나중에 직접 수정하겠습니다. –

0

나는 debuging 동안 중단 점을 사용하지만 당신은 그들이 런타임에 특정 유형과 일치하는지 확인해야하는 경우 다음이 만 디버깅이 아니라 주장과 함께 일하는 것이 주장과 테스트 데이터 타입

당신이 할 수있는 또 다른 한가지는 바로 drewag입니다 만난 응용 프로그램이 충돌하는 경우는 조건을 설정할 수 있습니다

어쩌면 assert(let tArray == oldArray as? NSArray[] //if not NSArray app crashes)

+0

이것은 var가 _specific_ 유형이고 _what_ 유형이 아님을 확인합니다. 귀하의 의견을 보내 주셔서 감사합니다. –

10

같은 반드시 쉽고도 유용이 아니다하지만, 그렇게 할 수 있습니다 :

,543,210

출력 :

_TtCSs22ContiguousArrayStorage00007F88D052EF58 
__NSDictionaryM 
__NSArrayI 
__NSArrayM 

당신은 스위프트의 isas 키워드를 사용하여 더 낫다. 많은 기초 클래스를 사용하면) __NSArrayI (불변)과 __NSArrayM (가변으로 볼 수있다 (클래스 클러스터를 사용합니다.

공지 재미있는 동작을. swiftArray 기본값을 swiftDictionaryNSMutableDictionary에 디폴트 동안 스위프트 Array<Int>를 사용하여. 이러한 종류의와 함께 난 정말 아무것도 특정 유형의 존재에 의존하지 않을 행동 (먼저 확인).

+2

왜 object_getClassName을 사용하지 않는가? – Brian

20

옵션 + 당신이 검사하고자하는 변수를 클릭합니다.

enter image description here

+0

이것은 Xcode 9에서는 작동하지 않는 것 같습니다. –

3

누군가가 위의이 언급,하지만 난 그게 답이 아닌 주석으로 가시성을받을 권리가 생각합니다.

var red, green, blue: Double 
print(type(of: green)) 

내가 알고있는 것을

더블

관련 문제