티스토리 뷰

Android/Etc

[ Etc #3 ] Kotlin 활용

녹색꼬맹이 2020. 4. 20. 15:28
반응형
SMALL

※ 개인적으로 정리 하려는 페이지 입니다.

 

예를들어 String 의 값이 Empty 를 체크 한다고 가정

interface Callback {
    fun notEmptyString(param: String)
}

 

 

// 1단계	( interface Callback Class 참조 )
fun notEmptyString_Stap1(param: String?, callback: Callback) {
    if (!param.isNullOrEmpty()) {
        callback.notEmptyString(param)
    }
}

// Use
private lateinit var data: String

data = "text"	// 무언가 통신을 하거나 결과값을 data 로 받는다고 가정한다.

// 1단계 use
notEmptyString_Stap1(data, object: Callback {
	override fun notEmptyString(param: String) {
		print("Stap1")
	}
})

 

// 2단계	( interface Callback Class 참조 )
fun String?.notEmptyString_Stap2(callback: Callback) {
    if (!this.isNullOrEmpty()) {
        callback.notEmptyString(this)
    }
}

// Use
private lateinit var data: String

data = "text"	// 무언가 통신을 하거나 결과값을 data 로 받는다고 가정한다.

// 2단계 use
data.notEmptyString_Stap2(object: Callback {
	override fun notEmptyString(param: String) {
		print("Stap2")
	}
})

 

반응형

 

// 3단계 High Order Function
fun String?.notEmptyString_Stap3(callback: (String) -> Unit) {
    if (!this.isNullOrEmpty()) {
        callback(this)
    }
}

fun String?.notEmptyString_Stap3(callback: (String) -> Unit, callback2: () -> Unit) {
    if (!this.isNullOrEmpty()) {
        callback(this)
    }
}


// Use
private lateinit var data: String

data = "text"	// 무언가 통신을 하거나 결과값을 data 로 받는다고 가정한다.

// 3단계 use
data.notEmptyString_Stap3 {
	print("Stap3")
}

data.notEmptyString_Stap3({
	print("Stap3 $it")
	}, {
	print("Stap3 여긴 뭐지??")
})

 

// DSL ?? ( Domain - specific Language )
// inline
inline fun String?.notEmptyString_Stap4(callback: (String) -> Unit) {
    if (!this.isNullOrEmpty()) {
        callback(this)
    }
}


// Use
private lateinit var data: String

data = "text"	// 무언가 통신을 하거나 결과값을 data 로 받는다고 가정한다.

data.notEmptyString_Stap4 {
            print("Stap4 $this")
        }

 

// KTX??
// 토스트를 메소드 형식으로 이뿌게 간결하게 쓸 수 있다.
inline fun Context.toast(text: CharSequence, duration: Int = Toast.LENGTH_SHORT): Toast =
    Toast.makeText(this, text, duration).apply { show() }
    
// use
toast("HI Inline Toast")


// infix 를 적용 하면?
infix fun Context.toast_withInfix(message: () -> String) {
    toast(message())
}


//use
toast_withInfix {
            "HI Infix Toast"
        }
       

 

토스트 메세지와 Duration 을 같이 적용 하려면 ?

// Message & Duration 함께 사용한다 ?
data class ToastData(val message: String, val duration: Int)
class ToastDataBuilder {
    var message: String = ""
    var duration: Int = Toast.LENGTH_SHORT
    fun build(): ToastData = ToastData(message, duration)
}

inline infix fun Context.toast_withDuarInput(body: ToastDataBuilder.() -> Unit) {
    val builder = ToastDataBuilder()
    builder.body()
    val item = builder.build()
    toast(item.message, item.duration)
}

//use
toast_withDuarInput {
            message = "HI Infix Toast Duar Input!"
            duration = Toast.LENGTH_LONG
        }

// Pair를 이용해서 다르게 처리 할 수 있다.
inline infix fun Context.toast_withPairInput(body: () -> Pair<String, Int>) {
    val (message, duration) = body()
    toast(message, duration)
}

//use
toast_withPairInput {
            "HI Infix Toast Pair Input!!" to Toast.LENGTH_LONG
        }

 

반응형
LIST
댓글