구성된 배열이 AnyObject
있습니다. 반복하고 배열 인스턴스 인 모든 요소를 찾고 싶습니다.
Swift에서 객체가 주어진 유형인지 어떻게 확인합니까?
구성된 배열이 AnyObject
있습니다. 반복하고 배열 인스턴스 인 모든 요소를 찾고 싶습니다.
Swift에서 객체가 주어진 유형인지 어떻게 확인합니까?
답변:
특정 유형을 확인하려면 다음을 수행하십시오.
if let stringArray = obj as? [String] {
// obj is a string array. Do something with stringArray
}
else {
// obj is not a string array
}
"as!"를 사용할 수 있습니다 obj
유형이 아닌 경우 런타임 오류가 발생합니다.[String]
let stringArray = obj as! [String]
한 번에 하나의 요소를 확인할 수도 있습니다.
let items : [Any] = ["Hello", "World"]
for obj in items {
if let str = obj as? String {
// obj is a String. Do something with str
}
else {
// obj is not a String
}
}
?
존재하지 않습니다. 그것은 같은 소리 as
와 ?
결합 될 때 런타임 검사를 수행합니다. as
없이 사용하기에 적절한시기는 언제 ?
입니까? 미리 감사드립니다.
as
를 빼고 ?
프로그램이 개체가 그렇지 않은 경우 프로그램이 즉시 정지 때문에 해당 유형의없는 복구 할 수있는 방법이없는 경우. 를 사용 ?
에 if
문은 프로그램을 계속 할 수 있습니다.
?
이 경우에 if를 사용하면 if 절에 그렇지 않으면 else 절에 대해 "일반"유형 검사를 수행 할 것이라고 생각했다 . 포함하지 않는 ?
당신이 런타임 오류 원인을 지적를 입력하지 않을 것이라고 다른 등. 다시 감사합니다.
?
경우 할당이 반환 nil
되어 if 문이 반환 false
되어 else 문으로 넘어 갑니다 . 그러나, 나는 그 설명이 이해하는 데 도움이,하지만 생각 if let
실제로 컴파일러 특별한 경우이다
에서 스위프트 2.2-5 당신이 지금 할 수있는 :
if object is String
{
}
그런 다음 배열을 필터링하십시오.
let filteredArray = originalArray.filter({ $0 is Array })
확인할 여러 유형이있는 경우 :
switch object
{
case is String:
...
case is OtherClass:
...
default:
...
}
object
A와 String
와 함께있는 동안, (스위프트 2 이상) 괄호 안에 let
솔루션 당신이 그것을 할 수 있습니다.
object
블록에서 사용하는 것이 좋기 때문에 무슨 뜻인지 이해하지 못합니다 .
object.uppercaseString
변수의 유형이 해당 유형으로 캐스트되지 않기 때문에 수행 할 수 없습니다 . 변수 (변수로 표시된)가String
객체 가 주어진 유형의 하위 유형 인지 만 알고 싶다면 더 간단한 방법이 있습니다.
class Shape {}
class Circle : Shape {}
class Rectangle : Shape {}
func area (shape: Shape) -> Double {
if shape is Circle { ... }
else if shape is Rectangle { ... }
}
“유형 검사 연산자 (is)를 사용하여 인스턴스가 특정 하위 클래스 유형인지 확인합니다. 유형 검사 연산자는 인스턴스가 해당 서브 클래스 유형이면 true를 반환하고 그렇지 않으면 false를 반환합니다.” 발췌 : Apple Inc.“Swift Programming Language.” iBooks .
위의 '특정 서브 클래스 유형의'이라는 문구가 중요합니다. 컴파일러에서 해당 값 을 ( 및 수퍼 클래스) 로 선언 하기 때문에 is Circle
및 의 사용 is Rectangle
이 허용됩니다 .shape
Shape
Circle
Rectangle
기본 유형을 사용하는 경우 수퍼 클래스는입니다 Any
. 예를 들면 다음과 같습니다.
21> func test (obj:Any) -> String {
22. if obj is Int { return "Int" }
23. else if obj is String { return "String" }
24. else { return "Any" }
25. }
...
30> test (1)
$R16: String = "Int"
31> test ("abc")
$R17: String = "String"
32> test (nil)
$R18: String = "Any"
is
에도 여전히 작동합니까? 감사.
object
as 을 선언하면 작동합니다 Any
. 예제로 업데이트되었습니다.
AnyObject
때문에 왜곡 된 것처럼 보입니다 . 다른 경우 , 이것은 실제로 훌륭한 해결책이 될 것입니다. 감사. AnyObject
NSObject
Any
두 가지 방법이 있습니다.
if let thisShape = aShape as? Square
또는:
aShape.isKindOfClass(Square)
자세한 예는 다음과 같습니다.
class Shape { }
class Square: Shape { }
class Circle: Shape { }
var aShape = Shape()
aShape = Square()
if let thisShape = aShape as? Square {
println("Its a square")
} else {
println("Its not a square")
}
if aShape.isKindOfClass(Square) {
println("Its a square")
} else {
println("Its not a square")
}
편집 : 3 지금 :
let myShape = Shape()
if myShape is Shape {
print("yes it is")
}
isKindOfClass
NSObject
프로토콜 의 방법입니다 . 그것은 그것을 채택하는 클래스 (NSObject에서 내려 오는 모든 클래스와 그것을 명시 적으로 채택하는 사용자 정의 Swift 클래스)에서만 작동해야합니다.
이것에 대해 경고하십시오 :
var string = "Hello" as NSString
var obj1:AnyObject = string
var obj2:NSObject = string
print(obj1 is NSString)
print(obj2 is NSString)
print(obj1 is String)
print(obj2 is String)
마지막 네 줄 모두가 true를 반환합니다.
var r1:CGRect = CGRect()
print(r1 is String)
... 물론 "거짓"을 인쇄하지만 CGRect에서 문자열로 캐스트에 실패했다는 경고가 표시됩니다. 따라서 일부 유형은 연결되어 있으며 'is'키워드는 암시 적 캐스트를 호출합니다.
다음 중 하나를 사용하는 것이 좋습니다.
myObject.isKind(of: MyClass.self))
myObject.isMember(of: MyClass.self))
사용되지 않은 정의 된 값 (일부 someVariable ...)으로 인해 경고를받지 않고 클래스를 확인하려는 경우 let 항목을 부울로 간단히 바꿀 수 있습니다.
if (yourObject as? ClassToCompareWith) != nil {
// do what you have to do
}
else {
// do something else
}
Xcode는 let 길을 사용하고 정의 된 값을 사용하지 않을 때 이것을 제안했습니다.
이 같은 것을 사용하지 않는 이유
fileprivate enum types {
case typeString
case typeInt
case typeDouble
case typeUnknown
}
fileprivate func typeOfAny(variable: Any) -> types {
if variable is String {return types.typeString}
if variable is Int {return types.typeInt}
if variable is Double {return types.typeDouble}
return types.typeUnknown
}
스위프트 3에서.
Swift 4.2, 제 경우에는 isKind 함수를 사용합니다.
isKind (of :) 수신자가 지정된 클래스의 인스턴스인지 또는 해당 클래스에서 상속 된 클래스의 인스턴스인지를 나타내는 부울 값을 리턴합니다.
let items : [AnyObject] = ["A", "B" , ... ]
for obj in items {
if(obj.isKind(of: NSString.self)){
print("String")
}
}
더 읽기 https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418511-iskind
받아 들여진 대답과 다른 것들을 기반으로 완전성을 기하기 위해 :
let items : [Any] = ["Hello", "World", 1]
for obj in items where obj is String {
// obj is a String. Do something with str
}
그러나 당신은 또한 할 수 있습니다 ( compactMap
또한 값을 "매핑" filter
) :
items.compactMap { $0 as? String }.forEach{ /* do something with $0 */ ) }
그리고 다음을 사용하는 버전 switch
:
for obj in items {
switch (obj) {
case is Int:
// it's an integer
case let stringObj as String:
// you can do something with stringObj which is a String
default:
print("\(type(of: obj))") // get the type
}
}
그러나 배열 (예 :)인지 확인하기 위해 질문을 고집하십시오 [String]
.
let items : [Any] = ["Hello", "World", 1, ["Hello", "World", "of", "Arrays"]]
for obj in items {
if let stringArray = obj as? [String] {
print("\(stringArray)")
}
}
또는 더 일반적으로 ( 이 다른 질문 답변 참조 ) :
for obj in items {
if obj is [Any] {
print("is [Any]")
}
if obj is [AnyObject] {
print("is [AnyObject]")
}
if obj is NSArray {
print("is NSArray")
}
}
as?
as
데이터 유형 이 특정 유형인지 테스트하지 않고 데이터 유형을 특정 유형으로 변환 하거나 표현할 수있는 경우에만 테스트 하므로 예상 결과를 항상 제공 하지는 않습니다 .
예를 들어이 코드를 고려하십시오.
func handleError ( error: Error ) {
if let nsError = error as? NSError {
Error
프로토콜에 맞는 모든 데이터 유형을 NSError
객체 로 변환 할 수 있으므로 항상 성공 합니다. 그러나 이것이 error
실제로 NSError
객체 또는 하위 클래스 라는 의미는 아닙니다 .
올바른 유형 검사는 다음과 같습니다.
func handleError ( error: Error ) {
if type(of: error) == NSError.self {
그러나 정확한 유형 만 확인합니다. 의 서브 클래스도 포함 시키려면 다음 NSError
을 사용해야합니다.
func handleError ( error: Error ) {
if error is NSError.Type {
이와 같은 응답이있는 경우 :
{
"registeration_method": "email",
"is_stucked": true,
"individual": {
"id": 24099,
"first_name": "ahmad",
"last_name": "zozoz",
"email": null,
"mobile_number": null,
"confirmed": false,
"avatar": "http://abc-abc-xyz.amazonaws.com/images/placeholder-profile.png",
"doctor_request_status": 0
},
"max_number_of_confirmation_trials": 4,
"max_number_of_invalid_confirmation_trials": 12
}
is_stucked
AnyObject로 읽을 값을 확인하고 싶습니다.
if let isStucked = response["is_stucked"] as? Bool{
if isStucked{
print("is Stucked")
}
else{
print("Not Stucked")
}
}
스위프트 5.2 & Xcode 버전 : 11.3.1 (11C504)
데이터 유형을 확인하는 솔루션은 다음과 같습니다.
if let typeCheck = myResult as? [String : Any] {
print("It's Dictionary.")
} else {
print("It's not Dictionary.")
}
도움이 되길 바랍니다.